从Google表格获取指向单个Google表单回复的链接

时间:2019-08-31 20:40:57

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

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

我要生成的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不同。换句话说,我无法从生成该链接所需的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脚本或其他配置来生成指向我的输出工作表中每个单独响应的链接?

1 个答案:

答案 0 :(得分: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 Apps。此解决方法的流程如下。

流量:

  1. 通过在ascii表上方创建电子表格。
    • Web应用程序用作“查看链接”的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. 为“执行应用程序为:”选择“用户正在访问网络应用程序” “我”
  3. 为“谁有权访问该应用程序:”选择“任何人,甚至是匿名的” 。这是一个测试案例。
    • 如果使用Only myself,则只有您可以访问Web Apps。那时,请使用您的访问令牌。
  4. 单击“部署”按钮作为新的“项目版本”。
  5. 自动打开“需要授权”对话框。
    1. 点击“查看权限”。
    2. 选择自己的帐户。
    3. 在“此应用未验证”中单击“高级”。
    4. 点击“转到###项目名称###(不安全)”
    5. 单击“允许”按钮。
  6. 单击“确定”。

3。运行脚本

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

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

注意:

  1. 修改Web应用程序的脚本后,请重新部署Web应用程序为新版本。这样,最新脚本将反映到Web Apps。如果即使修改了脚本也没有重新部署Web Apps,则不会使用最新的脚本。请注意这一点。

参考: