【问题标题】:Get a link to an individual Google Forms response from a Google Sheet从 Google 表格中获取指向单个 Google 表单响应的链接
【发布时间】:2019-08-31 20:40:57
【问题描述】:

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

我尝试生成的 URL(通过从表单转到 Responses -> Individual 获得,如下所示:

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 脚本或其他配置在我的输出表中生成指向每个单独响应的链接?

【问题讨论】:

  • “我不想使用编辑链接来查看我的回复。”这大概排除了Show URL used to edit responses from a Google Form in a Google Spreadsheet by using a script。但我不清楚你想要什么。请详细说明一下。
  • @Tedinoz 我想从我的工作表中获得一个超链接,它将您带到该特定响应的仅查看页面。查看表单时,您可以单击“响应 -> 个人”,它会显示表单的渲染视图,其中包含单个响应的内容。您可以浏览回复/选择一个特定的回复,它会向您显示那个回复。每个响应都有一个唯一的 URL,所以我希望有一种方法可以恢复该 URL 并将其用作链接。
  • @Tanaike 我仍然相信这是迄今为止最好的选择。需要明确的是,无论我评论的是 OP 的观点,而不是我的观点。
  • @TheMaster 感谢您的支持。我想修改接近 OP 目标的提案。当我这样做时,我想提出它。感谢您一直以来的支持。
  • @Tanaike 我仍然不完全明白您想澄清哪一部分,但我已尽力改善问题。如果还不清楚,请告诉我。

标签: google-apps-script google-sheets google-forms


【解决方案1】:
  • 您希望使用 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|
    +-----------+------------+------------------------------------------------------------+
    
  • 您想查看只读响应页面。

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

问题和解决方法:

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

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

流程:

  1. 通过将 ascii 表放在上方来创建电子表格。
    • Web Apps 用作“查看链接”的 URL。而从toPrefilledUrl()检索到的URL作为查询参数。
    • 之前已部署 Web 应用程序。
  2. 当用户访问链接时,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。部署网络应用

  1. 在脚本编辑器上,通过“发布”->“部署为 Web 应用”打开一个对话框。
  2. 选择“用户访问网络应用”“我”选择“执行应用为:”。
  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 应用程序中。如果即使修改了脚本也没有重新部署 Web 应用程序,则不会使用最新的脚本。请注意这一点。

参考资料:

【讨论】:

  • 您的建议似乎是最接近的选择。不幸的是,没有真正支持通过 API 生成视图链接。
  • 这就是您在当前答案中建议的更改。使用toPrefilledUrl 会生成一个指向可编辑、可提交表单的链接,其中复制了用户的响应。我正在寻找一个指向只读响应页面的链接,该页面显示他们实际提交的内容,全部在一个页。使用预填充的 URL 会丢弃上传的文件,并且不会像真正的表单视图那样在一个页面上显示所有部分。
  • @Tanaike 是的。没错。为 OP 翻译:当 op 使用您的解决方法 toPrefilledUrl,1. 如果表单有 说,2 个部分,您的 url 仅显示第一页。他必须单击下一步才能进入下一页。所以有 2 页。如果他正在访问https://docs.google.com/forms/d/{formId}/edit#response=###,那么所有部分的所有项目响应(针对单个表单响应)都在一页中。 2. 你的网址是editable- OP 想要只读。 3.您的网址丢弃上传的文件
  • @Tanaike RE:您的编辑,您确定它重定向了吗?在我的测试中,它似乎重定向到表单收到的第一个响应(不是正确的响应),并在角落显示“未找到响应”的错误。
  • @TheMaster 感谢您的评论。是的。我能注意到它。所以我通过提出其他解决方法更新了我的答案。你能确认一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2018-06-30
  • 2014-08-08
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多