提交完成后,每次获取Google表单的网址

时间:2018-06-21 09:15:36

标签: google-apps-script google-sheets google-form

我正在使用Google脚本将Google表单的网址成功获取到Google电子表格。但是,我必须手动单击“在Google脚本中运行”才能获取网址。

当有人单击Google表单中的“提交”按钮时,如何自动获取网址?

下面是我的脚本代码

function assignEditUrls() {
  var form = FormApp.openById('1F4YdKMGlJXn9w8aiq0UXzegWEfzjxUMd2CV2vewmoLQ');

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form Responses 1');

  var data = sheet.getDataRange().getValues();
  var urlCol = 37; 
  var responses = form.getResponses();
  var timestamps = [], urls = [], resultUrls = [];

  for (var i = 0; i < responses.length; i++) {
    timestamps.push(responses[i].getTimestamp().setMilliseconds(0));
    urls.push(responses[i].getEditResponseUrl());
  }
  for (var j = 1; j < data.length; j++) {

    resultUrls.push([data[j][0]?urls[timestamps.indexOf(data[j][0].setMilliseconds(0))]:'']);
  }
  sheet.getRange(2, urlCol, resultUrls.length).setValues(resultUrls);  
}

我还将项目触发器设置为在表单提交时 enter image description here

但是,即使提交,我仍然无法自动获取google表单的网址。我必须手动单击运行脚本才能在电子表格中获取网址

1 个答案:

答案 0 :(得分:1)

要使用“在表单上提交” 电子表格触发器,您首先需要确保表单为saving responses to that spreadsheet。然后,您可以使用event object来替换您已经声明的一些文字值。

不幸的是,触发器没有提供响应ID,因此您需要使用提供的时间戳手动搜索它。

function assignEditUrls(e) {
  var sheet = SpreadsheetApp.getActive().getSheetByName("Form Responses 1");
  var ts = new Date(e.namedValues.Timestamp[0]);
  var form = FormApp.openById("1F4YdKMGlJXn9w8aiq0UXzegWEfzjxUMd2CV2vewmoLQ");
  var formResponses = form.getResponses(ts);
  var editURLColumn = 37;
  var row = e.range.getRow();
  for (var i = 0; i < formResponses.length; i++) {
    var formResponseTs = (new Date(formResponses[i].getTimestamp())).getTime();
    if (formResponseTs === ts.getTime()) {
      var responseId = formResponses[i].getId();
      var editURL = formResponses[i].getEditResponseUrl();
      sheet.getRange(row, editURLColumn).setValue(editURL);
      break;
    }
  }
}