【问题标题】:onOpen trigger not being activated on Google FormonOpen 触发器未在 Google 表单上激活
【发布时间】:2014-06-23 16:04:56
【问题描述】:

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

我尝试创建一个函数 onOpen() 并创建一个 doIt() 函数并在资源 > 添加触发器菜单上手动将触发器添加到 onOpen。触发器已正确列出,并且似乎在打开表单以正确更新它时工作。可能那时我得到了错误的触发器处理程序,但没有其他我想要的(只是onEdit,应该做onOpen正在做的事情,以及onInstall)。

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

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

这表明 onOpen 应该完全按照我的意愿行事......所以现在我很困惑。

另外,我不确定权限将如何工作。目前,据我所知,似乎任何与我共享表单的人都可以编辑它,每个人都可以回答它,只要这个人有 URL。有没有办法将人们列入白名单来回答?我不太喜欢 URL 是阻止外人看到我正在加载到组合框中的数据的唯一障碍,最重要的是,通过提交表单来更新这些数据......似乎蛮力很容易解开很多“秘密”表格都是这样......或者从安全的角度来看可以吗,我只是疯了?

【问题讨论】:

    标签: google-apps-script google-forms


    【解决方案1】:

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

    见下图

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

    关于第二点,没有办法将允许填写表格的用户列入白名单,您所能做的就是根据使用的名称选择答案,并最终拒绝您不允许的答案。

    如果这个访问控制对你来说真的很重要,你可以使用 UiApp 或 HTML 服务来实现一些非常高效的东西,但这会有点复杂。

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

    【讨论】:

    • 那也行不通,因为我希望当用户打开表单进行回答时,组合框会填充项目,所以他可以选择一个,而不是在提交时(那将是太晚了)......我试过了,但没有奏效。同样,我不确定这个触发器是否存在,但我对制作动态组合框的其他方法持开放态度(即选择/选项或多项选择题)......
    • 您描述的工作流程似乎无法实现...您的意思是您的脚本创建了这个组合框吗?如果是,则 hten 表单不是正确的方法...使用 UiApp 或 htmlService 构建它
    • 是的,它基本上使用电子表格中的数据填充组合框。基本上我想做的是一个动态组合框,它从电子表格中加载它的项目。就像一个人的名单或类似的东西。而且它必须是最新的列表。
    • 哇,太可怕了!我脑子里有整个系统的想法,强烈依赖于这个功能......嗯,谢谢你的回答!
    • 我将其标记为正确,因为@Sergeinsas 指出我试图完成的事情是不可能的,因此使我的问题无法回答。也许他可以更新他的答案以添加我们在 cmets 中的对话,或者也许有人找到解决方法,然后我将相应地更新接受的答案:)
    【解决方案2】:

    我认为解决这个问题的诀窍是设置您的脚本以在存在填充表单的数据的电子表格的编辑时触发。您可能需要签入onEdit(e) 事件以查看您是否确实需要采取行动,例如检查事件对象是否已编辑。这样,只要您更新源数据,我们就会为您更新表单(相对于打开表单时)。

    【讨论】:

    • 听起来好像 OP 需要检查登录用户,以便选择要包含在填充选项中的项目,因此这不起作用。
    【解决方案3】:

    您可以实现您的意图,而是从打开的 FormView 触发,这将 overcall 函数,这不是正确的做法。 您需要对电子表格数据源进行触发,以检查数据是否发生变化,然后填充值。

    示例:对电子表格数据源,创建一个触发器以更改数据。

        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;
               }
          })
    }
    

    根据你的需要改变上面的开关

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多