onOpen触发器未在Google表单上激活

时间:2014-06-23 16:04:56

标签: google-apps-script google-form

我的Google表单上的onOpen事件仅在我打开版本表单时被激活,但是当我打开它来回答(/ viewform)时却没有。实际上,我只是希望它在有人打开表单来回答时运行,因为我的脚本使用表中的当前信息更新组合框。我不确定这是否是最佳方式,但我愿意接受建议。

我尝试了创建一个onOpen()函数,还创建了一个doIt()函数,并在Resources>上手动向onOpen添加了一个触发器。添加触发菜单。触发器已正确列出,似乎正在打开表单以便正确更新版本。可能我得到了错误的触发器处理程序,但是没有其他的我想要的东西(只是onEdit,应该做onOpen正在做的事情和onInstall)。

这方面的文档非常简洁,绝对专注于Spreadsheets脚本。他们提到了自定义钩子,称为可安装触发器,其中一个实际上是:

  

打开电子表格或表单编辑器时。 (请注意,当用户打开表单进行响应时,此触发器不会激活,而是在编辑器打开表单进行修改时激活。)与简单触发器onOpen不同,可安装触发器可以充当安装触发器的用户。 / p>

这表明onOpen应该完全符合我的要求......所以现在我很困惑。

另外,我不确定权限的工作方式。就目前而言,据我所知,似乎任何与我共享该表单的人都能够编辑它,并且每个人都可以回答它,只要该人拥有该URL即可。有没有办法将人们列入白名单来回答它?我不太喜欢URL是阻止外人看到我加载到组合框中的数据的唯一障碍,最重要的是,通过提交表单来更新这些数据......这似乎是暴力很容易解开很多秘密'以这种方式形成...或者从安全的角度来看是否可以,我只是疯了?

3 个答案:

答案 0 :(得分:2)

您需要安装的触发器不是onOpen,而是onFormSubmit。 显示在脚本编辑器/ ressources /当前脚本触发器

见下图 enter image description here

正如您已阅读(但显然未被理解),onOpen触发器仅在有人打开表单编辑器时触发,而不是在有人填写(提交)表单时触发。

关于第二点,无法将允许填写表单的用户列入白名单,您只能根据使用的名称选择答案,并最终拒绝您不允许的答案。

如果此访问控制对您来说非常重要,那么您可以使用UiApp或HTML服务实现一些非常高效的功能,但这会更复杂。

关于您关于权限的最后一点,事情非常简单:可安装触发器以创建触发器的用户身份运行。如果您这样做,那么脚本将像使用您的权限和访问权限手动运行一样运行。

答案 1 :(得分:0)

我认为这样做的诀窍是设置你的脚本以触发电子表格的编辑,其中填充表格的数据存在。您可能需要检查onEdit(e)事件,看看您是否确实需要采取行动,例如检查事件对象的编辑内容。这样,只要您更新源数据,我们就会为您更新表单(与打开表单时相比)。

答案 2 :(得分:0)

您可以实现自己的意图,但可以从打开的FormView触发,这将覆盖功能,但这不是正确的方法。 您需要触发电子表格数据源,以检查数据是否已更改,然后填充值。

示例:对于电子表格数据源,进行触发以更改数据。

    function OnDataChange()
{
   let form = FormApp.openById("YourformID"); 
/* 
   or if data source are also linked to form, you could do this: 
   ss = SpreadsheetApp.getActiveSpreadsheet(); 
   form = FormApp.openByUrl(ss.getFormUrl());
 */

   let names = ss.getSheetByName("Names").getDataRange().getValues().map(x => x[0]).slice(1);
   FillItem(form,"Name",names)
   
} 
function FillItem(form,itemtitle,values)
{
  form.getItems().filter(el => el.getTitle()==itemtitle)
      .forEach( el => { 
           switch(el.getType()) {
             case FormApp.ItemType.LIST:
                  el.asListItem().setChoiceValues(values);
                  break;
             case FormApp.ItemType.MULTIPLE_CHOICE:
                  el.asMultipleChoiceItem().setChoiceValues(values);
                  break;
           }
      })
}

根据您的需要更改上述开关