从Google表格中获取单个Google表单回应的链接

8
我有一个谷歌表单,其输出响应到谷歌表格。我的一些表单问题有很长的段落回答,因此我想能够在跟踪表中的每一行上点击一个链接,并将其打开原始响应页面,该页面如在表单的“响应”选项卡中所见。
我试图生成的URL,是通过从我的表单中进入“响应 -> 个人”的方式来获取的,看起来像:
https://docs.google.com/forms/d/<form_id>/edit#response=<response_id>

我已经查看了FormResponse API文档,但我无法从FormResponse对象中提取与Google表单查看器使用的相同ID。虽然我知道适当的表单ID,但对于该URL有效的响应ID与FormResponse.getId()或作为FormResponse.getEditResponseUrl()的一部分返回的ID不同。换句话说,我无法获取需要生成该链接的表单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 Script 或其他配置,生成一个链接返回到每个单独的响应在我的输出表中?

1
@Tedinoz,我想在我的表格中添加一个超链接,可以跳转到特定响应的只读页面。当查看表单时,您可以点击“响应->个体”,它会显示一个表单的渲染视图,并带有单个响应的内容。您可以翻页/选择特定响应,然后它会显示该响应。每个响应都有唯一的URL,因此我希望有一种方法来检索该URL并将其用作链接。 - Wasabi Fan
如果您只想查看完整答案,可以创建一个网页,在侧边栏中显示该行中的所有答案。 - TheMaster
1
@Tanaike,我仍然相信这是目前最好的选择。为了明确起见,我所评论的一切都是原帖作者的观点,而不是我的观点。 - TheMaster
1
@TheMaster 感谢您的支持。我想修改一下实现 OP 目标的建议。当我完成后,我会向您提出建议。非常感谢您一直以来的支持。 - Tanaike
1
@Tanaike,我仍然不完全理解您需要澄清的部分,但我已尽力改进问题。如果还不清楚,请告诉我。 - Wasabi Fan
显示剩余6条评论
1个回答

1
  • You want to achieve to create the Spreadsheet which has the following value using Google Apps Script.

    +-----------+------------+------------------------------------------------------------+
    |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|
    +-----------+------------+------------------------------------------------------------+
    
  • You want to see the response page with the read only.

如果我理解正确,下面的解决方法如何?
问题和解决方法:
- 每个响应的终点不能直接创建。 - 从 `toPrefilledUrl()` 检索到的 URL 可以提交。因此,它不是只读页面。
不幸的是,从上述情况来看,需要考虑解决方法。在这个解决方法中,我使用了 `toPrefilledUrl()` 和 Web Apps。这个解决方案的流程如下。
流程:
- 通过放置上面的 ASCII 表格来创建电子表格。
- Web 应用程序用作“查看链接”的 URL。从 `toPrefilledUrl()` 中检索到的 URL 用作查询参数。 - Web 应用程序已部署。
- 当用户访问链接时,Web 应用程序会打开。
- 运行 Web 应用程序时,从 `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. 为“谁可以访问应用程序:”选择“任何人,甚至匿名用户”。这是一个测试用例。
    • 如果使用仅限我自己,则只有您可以访问Web应用程序。此时,请使用您的访问令牌。
  4. 单击“部署”按钮作为新的“项目版本”。
  5. 自动打开“需要授权”的对话框。
    1. 单击“查看权限”。
    2. 选择自己的帐户。
    3. 在“此应用未经验证”处单击“高级”。
    4. 单击“转到###项目名称###(不安全)”
    5. 单击“允许”按钮。
  6. 单击“确定”。

3. 运行脚本

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

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

注意:

  1. 当您修改Web应用程序的脚本时,请重新部署Web应用程序作为新版本。这样,最新的脚本将反映在Web应用程序中。如果即使脚本已被修改但未重新部署Web应用程序,则不会使用最新的脚本。请注意此事项。

参考资料:


@Wasabi Fan,我可以问一下你当前问题的目标吗?你想如何处理检索到的URL?如果你想将URL放入电子表格中,我认为Google Apps Script可以实现。但首先,我想正确理解你的目标。 - Tanaike
1
这是您在当前答案中提出的更改建议。使用 toPrefilledUrl 会生成一个链接,该链接指向可编辑、可提交的表单,并将用户的响应复制到其中。我正在寻找一个链接,该链接指向只读响应页面,以显示他们实际提交的所有内容。与真正的表单视图一样,使用预填充的URL会删除上传的文件并且不会在一页上显示所有部分。 - Wasabi Fan
1
@Tanaike 是的。没错。为 OP 翻译:当 OP 使用您的解决方法 toPrefilledUrl 时,1. 如果表单有 比如说,2 个部分,则您的 URL 只显示第一页。他必须点击“下一页”才能进入下一页。因此有 2 页。如果他正在访问 https://docs.google.com/forms/d/{formId}/edit#response=###,那么所有部分(对于单个表单响应)的所有项目响应都在 一个页面 中。2. 您的 URL 是可编辑的 - OP 希望是 只读 的。3. 您的 URL 会删除已上传的文件。 - TheMaster
1
@Tanaike 关于您的编辑,您确定它会重定向吗?在我的测试中,它似乎会重定向到表单接收到的第一个响应(而不是正确的响应),并在角落显示一个错误,指出“未找到响应”。 - Wasabi Fan
1
@TheMaster 感谢您的评论。是的,我注意到了。因此,我更新了我的答案,提出了其他解决方法。您能否确认一下? - Tanaike
显示剩余23条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接