【问题标题】:Google Trigger for Edited Form Entry用于编辑表单条目的 Google 触发器
【发布时间】:2020-03-30 23:27:51
【问题描述】:

我有一个将编辑响应 URL 放在第 100 列的触发器。

不知道我抄袭谁,请随意引用自己,lol

function assignEditUrls() {
  var form = FormApp.openById('XXXXXXXXXXXXXX');
    //enter form ID here

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Current');

    //Change the sheet name as appropriate
  var data = sheet.getDataRange().getValues();
  var urlCol = 100; // column number where URL's should be populated; A = 1, B = 2 etc
  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);  
}

但是,我需要扩展它以运行两个不同脚本之一,具体取决于这是对表单的初始响应还是对现有响应的编辑

//first run
if (check_if_edited(e)==false)
{
  do_something();
}
//all other runs
else 
{
  do_something_else();
}

我该怎么做?

[编辑]

我很抱歉:我想根据回复执行此操作,而不是针对第一次提交表单。所以初始响应运行一个脚本,但如果用户编辑他们的响应,我需要运行一个单独的脚本

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。我无法理解a trigger that places the Edit Response URL in the 100th columnHowever, i need to expand it to run one of two different scripts, depending on if this is the initial response to a form or an edit of an existing response。可以问一下他们的详细情况吗?
  • 好吧,谷歌表单允许您编辑以前提交的回复,上面的脚本记录了允许您编辑它们的链接。其次,我想在有人提交条目时运行一个脚本。但如果他们编辑一个条目,我想运行一个单独的脚本
  • 感谢您的回复。不幸的是,我无法从您的回复中了解您的目标。这是因为我的英语水平不好。对此我深表歉意。
  • 嗯,不幸的是,它并没有完全回答我的问题,哈哈。

标签: google-apps-script google-sheets triggers google-forms


【解决方案1】:

答案:

使用属性服务在第一次运行后保存键值对以供将来检查。

更多信息:

根据文档:

此服务允许脚本将字符串存储为键值对,范围仅限于一个脚本、一个脚本用户或一个使用编辑器插件的文档。

所以你可以使用它来创建一个绑定到脚本的变量,在第一次运行时,然后根据它是否存在来更改你想要执行的代码。您可以将其视为一个全局范围的布尔值,在脚本执行完成后继续存在。

代码:

编辑您的示例:

function onFormSubmit() {
  var sp = PropertiesService.getScriptProperties();
  var user = e.response.getRespondentEmail());

  //first run
  if (!sp.getProperty(user)) {
    do_something();
    sp.setProperty(user, true);
  }
  //all other runs
  else {
    do_something_else();
  }
}

确保在表单 UI 中的 ⚙️ &gt; General &gt; Collect email addresses 复选框中启用收集回复者电子邮件地址的设置。

您还需要将其设置为可从 Apps 脚本 UI 中的 View &gt; Current project's triggers 访问的触发器页面提交表单时的可安装触发器。

参考资料:

【讨论】:

  • 我很抱歉我的误解,我在这方面还很陌生。这是一个有趣的解决方案,但不幸的是,我有数百个回复。我想跟踪编辑后的回复,而不是第一次提交表单。这对数千人有用,还是只对一个人有用?
  • 此表单是否每个用户运行一次?
  • 不是每个用户,而是每个响应,并且可能,或者只是一次。
  • 在这种情况下,您可以将用户的电子邮件保存为键值对并根据用户名是否已保存来运行脚本。请确保打开收集电子邮件地址设置!我已经更新了我的答案。
猜你喜欢
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
相关资源
最近更新 更多