【问题标题】:Form answer Spreadsheet - onChange trigger表单答案电子表格 - onChange 触发器
【发布时间】:2014-09-25 11:32:23
【问题描述】:

我想询问关于在 Google 表单对电子表格进行更改后运行 onChange 触发器

我有这个更改后发送电子邮件的源代码:

function onChange(e){

    var sheet = SpreadsheetApp.getActiveSheet();

    var helpRange = sheet.getRange(2, 16);
    var debugRange = sheet.getRange(2,17);
    var startRow = helpRange.getValue();
    var numRows = sheet.getLastRow() - startRow + 1;   // Number of rows to process
    debugRange.setValue(numRows);
    var dataRange = sheet.getRange(startRow, 1, numRows, 11);
    var data = dataRange.getValues();
    var cal = CalendarApp.getDefaultCalendar();
    for (i in data) {
      var row = data[i];
      var title = row[3];
      var desc = "Description: " + row[4] + " Requested Accounts: " + row[5] + " Marketing Support: " + row[6] + " Responsible Salesman " + row[8] + " Email: " + row[9] + " " + row[10];      // Second column
      var tstart = row[1];
      var tstop = row[2];
      var loc = row[7];

      cal.createEvent(title, new Date(tstart), new Date(tstop), {description:desc,location:loc});


      helpRange.setValue(sheet.getLastRow() + 1);
      var emailAddress = sheet.getRange(sheet.getLastRow(), 10).getValue(); 
      var subject = "New Event Created: " + title;
      Browser.msgBox(emailAddress + " " + subject + " "+ desc);
      MailApp.sendEmail(emailAddress, subject, desc); 

    }
}

此电子表格应由 Google 表单自动填写(当用户提交答案时),其他用户不应对其进行任何更改。每次我在物理上进行一些更改时都会触发这个 onChange 触发器(正如预期的那样,但这不会发生),但是当我从 Google Form 提交答案时,它也会显示在电子表格中,但不会触发 onChange 触发器。

为什么?

我可以编写它以便在 Google 表单进行更改后触发触发器吗?

【问题讨论】:

标签: javascript google-apps-script google-sheets spreadsheet google-forms


【解决方案1】:

有4个要点可以理解为什么它不起作用:

  1. 就像 ryan-roth 所说,在这种情况下使用的方法是onFormSubmit()
  2. 此方法尤其必须在Installable Trigger 中使用,因此您必须通过Apps 脚本仪表板或使用ScriptApp 服务以编程方式创建它,我建议这样做,因为它更容易理解发生了什么。以下代码是为此案例创建触发器的函数示例:
function createTriggerFunction(){
  //Get the target spreadsheet
  var ss = SpreadsheetApp.openById('XXXXXXXXXXXX');
  //Create a new trigger using ScriptApp service passing your function as parameter
  ScriptApp.newTrigger("yourMailFunction")
  .forSpreadsheet(ss)
  .onFormSubmit()
  .create()
  
}
  1. 现在,要安装这个新触发器,在您的 Google App 脚本编辑器中,您必须在 Select Function 列表中选择此 createTriggerFunction() 并运行一次,否则您将创建相同的每次运行时触发。

  2. 这一点对于它的工作很重要:重写函数适用于 Simple 触发器,在这种情况下 onChange() 和 onFormSubmit() are not。因此,在这种情况下,您的代码将在一个名为 yourMailFunction 的新函数中使用它来运行此示例。

function yourMailFunction(e){

    var sheet = SpreadsheetApp.openById('XXXXXXXXXXXX');

    ...

    }
}

重要

请注意,我使用了SpreadsheetApp.openById('XXXXXXXXXXXX') 而不是SpreadSheetApp.getActiveSheet()。这非常重要,因为当表单提交并在关联的电子表格中插入新行时,没有活动的电子表格,因此您必须通过其 ID 调用它。 p>

【讨论】:

    【解决方案2】:

    正如 eddyparkinson 所说,您肯定需要表单提交触发器,而不是更改或编辑触发器。

    可以在 Google 表单或接收表单响应的 Google 表格中设置form submit trigger。每种情况下的触发事件略有不同; Google Sheets form submit event 包含简单数组中的表单条目值(e.values、e.namedValues),而 Forms form submit event 包含一个 FormResponse 对象,可以查询有关表单提交的所有信息。

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多