适用于多张表的单一Google表单

Tim*_*Tim 4 google-sheets google-apps-script google-forms

由于正在进行的开发版本控制,以及实现用户权限解决方案的看似无法克服的问题,我需要捕获链接到未向用户公开的工作表的表单数据.相反,我想使用自定义菜单从单独的电子表格应用程序启动表单.尽管彻底的谷歌搜索,以及令人着名的'FormApp.openById'方法,我找不到实现这一目标的方法.

我知道我在这里偏离轨道; 谁能指点我回去的路?

Mog*_*dad 12

第1步:创建表单

正常的操作过程 - 通过脚本或使用Forms UI创建表单.捕获表单的ID.例如,在编辑器中的URL:

https://docs.google.com/forms/d/1-AWccGNgdJ7_5Isjer5K816UKNSaUPSlvlkY3dGJ1UQ/edit
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

附加电子表格以捕获回复.(我们不会在这里做更多的事情.)

第2步:客户端脚本

在用户可访问的电子表格中,创建一个容器绑定的脚本(以便它可以访问电子表格UI).以下脚本生成一个自定义菜单,其中包含一个在Ui弹出窗口中启动表单的选项.

/**
 * Uses the Forms service to get a handle on an existing form, then retrieve its published URL.
 * Uses the UrlFetch Service to get a copy of the HTML for the form.
 * Uses the HtmlService to embed the form's HTML in a Spreadsheet UI.
 * ... which is finally shown using Spreadsheet.show().
 */
function launchForm() {
  var formID = '1-AWccGNgdJ7_5Isjer5K816UKNSaUPSlvlkY3dGJ1UQ';
  var form = FormApp.openById(formID);
  var formUrl = form.getPublishedUrl();

  var response = UrlFetchApp.fetch(formUrl);
  var formHtml = response.getContentText();

  var htmlApp = HtmlService
      .createHtmlOutput(formHtml)
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setTitle('Ta Daaa!')
      .setWidth(500) 
      .setHeight(450);

  SpreadsheetApp.getActiveSpreadsheet().show(htmlApp);
}

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Launch Form",
    functionName : "launchForm"
  }];
  sheet.addMenu("Custom Menu", entries);
};
Run Code Online (Sandbox Code Playgroud)

演示

这是您从"自定义菜单"中选择"启动表单"时看到的内容.但是有一点小烦恼 - 当提交表单时,用户将被带到另一个浏览器窗口或选项卡.在电子表格中,UI保持打开状态,需要手动关闭.IFRAME沙盒问题已经消失了!

截图 - 嵌入式表格


编辑:最近引入了ECMA沙箱默认值的更改,这要求将沙箱模式显式设置为NATIVE以使此技术起作用.代码已更新.

再次编辑:较新的IFRAME沙箱模式将整个表单体验保留在对话框中.

  • 提交表单的按钮在弹出窗口中不起作用.为什么? (3认同)
  • 嗨 Mogsdad,我刚刚开始使用这种方法,而且效果很好 - 再次感谢!然而,一个问题是加载需要很长时间。表单本身并不是特别复杂,由 17 个字段组成,其中只有 2 个具有 <30 个项目的列表。当从承载表单的工作表中的“表单”菜单启动时,它会像往常一样在新选项卡中快速加载。我想我需要编辑 css 以去除一些由 Google 创建的默认标签,但想知道是否还有其他我可能忽略的东西 - 有什么想法吗? (2认同)