繁体   English   中英

从 Google 表格中获取指向单个 Google 表单响应的链接

[英]Get a link to an individual Google Forms response from a Google Sheet

我有一个 Google 表单,它输出对 Google 表格的响应。 我的一些表单问题有很长的段落回复,因此我希望能够单击跟踪表中每一行的链接,并打开原始回复页面,如表单的“回复”选项卡所示。

我试图生成的 URL 是通过从我的表单转到响应 -> 个人获得的,如下所示:

https://docs.google.com/forms/d/<form_id>/edit#response=<response_id>

我查看了FormResponse API 文档,但无法从FormResponse对象中提取与 Google 表单查看器使用的 ID 相同的 ID。 虽然我知道适当的表单 ID,但对该 URL 有效的响应 ID 与FormResponse.getId()或作为FormResponse.getEditResponseUrl()一部分返回的响应 ID 不同。 换句话说,我无法从生成该链接所需的 Forms API 获取数据。 我宁愿不使用他们支持生成的编辑链接来查看我的回复。

我的最终目标是在我的回复表单的每一行中都有一个具有上述格式的链接。 具有该格式的正确链接会将您带到该行中特定响应的单个响应查看器页面。 即,我想把这个:

+-----------+------------+
|Question 1 | Question 2 |
+-----------+------------+
|Long answer| Another ans|
+-----------+------------+
|One more an| Additional |
+-----------+------------+

成这个

+-----------+------------+------------------------------------------------------------+
|Question 1 | Question 2 | View link                                                  |
+-----------+------------+------------------------------------------------------------+
|Long answer| Another ans| https://docs.google.com/forms/d/abc123/edit#response=def456|
+-----------+------------+------------------------------------------------------------+
|One more an| Additional | https://docs.google.com/forms/d/abc123/edit#response=ghi789|
+-----------+------------+------------------------------------------------------------+

作为参考,我尝试将 URL 生成为"https://docs.google.com/forms/d/" + formId + "/edit#response=" + responses[i].getId() ,但是在访问该 URL 时它说响应 ID 无效。

有没有办法通过 Apps 脚本或其他配置在我的输出表中生成返回每个单独响应的链接?

  • 您希望使用 Google Apps 脚本创建具有以下值的电子表格。

     +-----------+------------+------------------------------------------------------------+ |Question 1 | Question 2 | View link | +-----------+------------+------------------------------------------------------------+ |Long answer| Another ans| https://docs.google.com/forms/d/abc123/edit#response=def456| +-----------+------------+------------------------------------------------------------+ |One more an| Additional | https://docs.google.com/forms/d/abc123/edit#response=ghi789| +-----------+------------+------------------------------------------------------------+
  • 您想查看只读的响应页面。

如果我的理解是正确的,那么以下解决方法如何?

问题和解决方法:

  • 不能直接创建每个响应的端点。
  • 检索toPrefilledUrl()的 URL toPrefilledUrl()可以提交。 所以它不是只读页面。

不幸的是,从上述情况来看,需要考虑解决方法。 在这个解决方法中,我使用了toPrefilledUrl()和 Web Apps。 此变通方法的流程如下。

流动:

  1. 通过放置在 ascii 表上方创建电子表格。
    • Web Apps 用作“查看链接”的 URL。 并且从toPrefilledUrl()检索到的 URL 用作查询参数。
    • 之前部署了 Web Apps。
  2. 当用户访问该链接时,Web Apps 被打开。
    • 当 Web Apps 运行时,将从toPrefilledUrl()的 URL 中检索 HTML 数据,并删除提交按钮。 然后,打开编辑后的 ​​HTML。

这样,可以显示只读响应。

用法:

要使用此解决方法,请执行以下流程。

1.复制粘贴脚本

请打开您要使用的 Google 表单的脚本编辑器。 并将以下脚本复制并粘贴到脚本编辑器中。

function doGet(e) {
  var url = Utilities.newBlob(Utilities.base64Decode(e.parameter.u)).getDataAsString();
  var html = UrlFetchApp.fetch(url)
    .getBlob()
    .getDataAsString()
    .replace('<span class="quantumWizButtonPaperbuttonLabel exportLabel">Submit</span>', "");
  return HtmlService.createHtmlOutput(html);
}

function myFunction() {
  var webApps = ScriptApp.getService().getUrl();
  var form = FormApp.getActiveForm();
  var items = form.getItems();
  var headers = form.getItems().map(function(e) {return e.getTitle()});
  headers.push("View link");
  var formId = form.getId();
  var responses = form.getResponses();
  var obj = responses.map(function(e, i) {
    var temp = e.getItemResponses().reduce(function(o, f) {
      o[f.getItem().getTitle()] = f.getResponse();
      return o;
    }, {})
    temp["View link"] = "=HYPERLINK(\"" + webApps + "?u=" + Utilities.base64Encode(e.toPrefilledUrl()) + "\", \"response" + (i + 1) + "\")";
    return temp;
  });
  var values = obj.map(function(e) {
    return headers.map(function(f) {
      return f in e ? (typeof e[f] == "object" ? e[f].join(",") : e[f]) : "";
    })
  });
  values.unshift(headers);

  // As a sample, it creates new Spreadsheet and put values.
  var sheet = SpreadsheetApp.create("sampleSpreadsheet").getSheets()[0];
  sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}

2. 部署 Web 应用程序

  1. 在脚本编辑器上,通过“发布”->“部署为 Web 应用程序”打开一个对话框。
  2. 为“将应用程序执行为:”选择“用户访问 Web 应用程序”“我”。
  3. 为“谁有权访问应用程序:”选择“任何人,甚至匿名”。 这是一个测试用例。
    • 如果Only myself ,则只有您可以访问 Web Apps。 届时,请使用您的访问令牌。
  4. 单击“部署”按钮作为新的“项目版本”。
  5. 自动打开“需要授权”对话框。
    1. 单击“查看权限”。
    2. 选择自己的帐户。
    3. 在“此应用程序未经验证”处单击“高级”。
    4. 点击“转到###项目名称###(不安全)”
    5. 单击“允许”按钮。
  6. 单击“确定”。

3.运行脚本

  1. 运行myFunction() 这样,就创建了新的电子表格。
  2. 打开创建的电子表格。
  3. 单击“查看链接”单元格。

这样,Web Apps 就会运行,您可以看到只读的响应页面。

笔记:

  1. 当您修改 Web Apps 的脚本时,请将 Web Apps 重新部署为新版本。 这样,最新的脚本就会反映到 Web Apps 中。 如果即使修改了脚本也不重新部署 Web Apps,则不会使用最新的脚本。 请注意这一点。

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM