google-apps-script script教學 - 是否可以使用谷歌電子表格中的數據“預填充”谷歌表格?




form examples (2)

我正在尋找一種方法來使用谷歌電子表格中的特定數據“預填充”谷歌表格。 表單將為每個人提供相同的“標準”問題,但前兩個問題中的數據將使用現有Google電子表格中的唯一數據“預先填充”。 根據現有電子表格中的電子郵件地址,數據將是唯一的。

來源電子表格示例

Col 1       Col 2        Col 3 
email       name         birthday  
@mike       Mike Jones   May 9th 1975  
@jim        Jim Smith    April 19th 1985

形式示例一

問題1 - 從谷歌電子表格預填充數據(邁克瓊斯)

問題2 - 從谷歌電子表格預填充數據(1975年5月9日)

問題3 - 空白(等待用戶回复)

問題4 - 空白(等待用戶回复)

表格示例二

問題1 - 從谷歌電子表格預填充數據(吉姆史密斯)

問題2 - 從谷歌電子表格預填充數據(1985年4月19日)

問題3 - 空白(等待用戶回复)

問題4 - 空白(等待用戶回复)

有誰知道這是否可以做到? 如果是,任何幫助或指示都將非常感激。

先謝謝你!
托德


Answers

您可以在表單編輯器中創建預填表單URL,如Drive Forms文檔中所述。 您最終會得到這樣的網址,例如:

https://docs.google.com/forms/d/--form-id--/viewform?entry.726721210=Mike+Jones&entry.787184751=1975-05-09&entry.1381372492&entry.960923899

buildUrls()

在此示例中,問題1“名稱”的ID為726721210 ,而問題2“生日”為787184751 。 問題3和4是空白的。

您可以通過將通過UI提供的URL調整為模板來生成預填充的URL,如下所示:

function buildUrls() {
  var template = "https://docs.google.com/forms/d/--form-id--/viewform?entry.726721210=##Name##&entry.787184751=##Birthday##&entry.1381372492&entry.960923899";
  var ss = SpreadsheetApp.getActive().getSheetByName("Sheet1");  // Email, Name, Birthday
  var data = ss.getDataRange().getValues();

  // Skip headers, then build URLs for each row in Sheet1.
  for (var i = 1; i < data.length; i++ ) {
    var url = template.replace('##Name##',escape(data[i][1]))
                      .replace('##Birthday##',data[i][2].yyyymmdd());  // see yyyymmdd below
    Logger.log(url);  // You could do something more useful here.
  }
};

這很有效 - 您可以通過電子郵件將預先填好的URL發送給每個人,他們已經填寫了一些問題。

betterBuildUrls()

我們可以通過編程方式將它拼湊在一起,而不是使用強力創建模板。 這樣做的好處是我們可以重用代碼而無需記住更改模板。

表單中的每個問題都是一個項目。 對於這個例子,我們假設表單只有4個問題,正如您所描述的那樣。 Item [0]是“Name”, [1]是“Birthday”,依此類推。

我們可以創建一個表單響應,我們不會提交 - 相反,我們將部分完成表單,只是為了獲得預先填寫的表單URL。 由於Forms API理解每個項的數據類型,因此我們可以避免操作日期和其他類型的字符串格式,這在某種程度上簡化了我們的代碼。

編輯: 如何預填谷歌表格複選框有一個更通用的版本

/**
 * Use Form API to generate pre-filled form URLs
 */
function betterBuildUrls() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Sheet1");
  var data = ss.getDataRange().getValues();  // Data for pre-fill

  var formUrl = ss.getFormUrl();             // Use form attached to sheet
  var form = FormApp.openByUrl(formUrl);
  var items = form.getItems();

  // Skip headers, then build URLs for each row in Sheet1.
  for (var i = 1; i < data.length; i++ ) {
    // Create a form response object, and prefill it
    var formResponse = form.createResponse();

    // Prefill Name
    var formItem = items[0].asTextItem();
    var response = formItem.createResponse(data[i][1]);
    formResponse.withItemResponse(response);

    // Prefill Birthday
    formItem = items[1].asDateItem();
    response = formItem.createResponse(data[i][2]);
    formResponse.withItemResponse(response);

    // Get prefilled form URL
    var url = formResponse.toPrefilledUrl();
    Logger.log(url);  // You could do something more useful here.
  }
};

yymmdd功能

預填表格URL中的任何日期項目都應採用以下格式: yyyy-mm-dd 。 此輔助函數使用新方法擴展Date對像以處理轉換。

從電子表格中讀取日期時,只要數據格式可以識別為日期,您就會得到一個javascript Date對象。 (你的例子是不可識別的,所以不是May 9th 1975你可以使用5/9/1975 。)

// From http://blog.justin.kelly.org.au/simple-javascript-function-to-format-the-date-as-yyyy-mm-dd/
Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear().toString();                                    
  var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based         
  var dd  = this.getDate().toString();             

  return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};

以下代碼執行所需操作

function doTest() {
  SpreadsheetApp.getActiveSheet().getRange('F2').setValue('Hello');
}




google-apps-script google-spreadsheet google-form