FormResponse.GetId() 返回不正确的响应 ID?

FormResponse.GetId() returning incorrect response ID?

我正在尝试为我的 Google 表单设置一个 webhook,一切都很好,直到我尝试检索要在 URL 中使用的响应的 ID,如下所示:

function onSubmit(e) {
    var form = FormApp.getActiveForm();
    var allResponses = form.getResponses();
    var latestResponse = allResponses[allResponses.length - 1];
    var formID = "top-secret";
    var link = "https://docs.google.com/forms/d/" + formID + "/edit#response=" + latestResponse.getId();
}

我已经查看了 Google Apps 脚本文档,看起来 getId() 就是我想要的。问题是我从中获得的 ID 不正确。当我尝试使用此 ID 访问 link 时,我得到 Response not found.

例如

getId() returns 2_ABaOnufCTeHiCWUFr0VRcCb8wkiWIZzeIZQU0xyP5pppD7oSr3nPFQ4y8VdOA96dYU_5Ros 而来自表单本身的实际响应 ID returns ACYDBNiLhfYgdxvkakafdps42HYuaZYkU-LrsjBtvt9ABhzal71zZWZnNsTxHVTrm6gom_E

我是否需要进行一些转换才能使这项工作正常进行,或者我应该使用其他一些功能吗?

我认为在当前阶段,很遗憾,https://docs.google.com/forms/d/{formId}/edit#response={responseId}responseId 的值无法通过 Google Forms 服务检索。 Rer 所以在这种情况下,需要使用几个变通方法。

解决方法 1:

它使用getEditResponseUrl()。使用该方法时,得到如下URL

https://docs.google.com/forms/d/e/{ID1}/viewform?edit2={ID2}
  • 在这种情况下,ID1 不是表单 ID。 ID2 与脚本中 latestResponse.getId() 检索到的 ID 相同。
  • 当您的脚本被使用时,您可以通过latestResponse.getEditResponseUrl()检索此URL。

解决方法 2:

它使用toPrefilledUrl()。使用该方法时,得到如下URL

    https://docs.google.com/forms/d/e/{ID1}/viewform?usp=pp_url&entry.###=###&entry.###=###,,,
  • 在这种情况下,ID1 不是表单 ID。并且,每个值由 entry.###=###.
  • 给出
  • 当您的脚本被使用时,您可以通过latestResponse.toPrefilledUrl()检索此URL。

2022 年 3 月 16 日更新:

解决方法 3:

在此解决方法中,使用了 Google 表单 API。 Google Forms API 已经发布了稳定的 generally-available v1。 Ref

当前阶段,端点由https://forms.googleapis.com/v1beta/forms/变为https://forms.googleapis.com/v1/forms/。而且,您也可以在不加入“早期采用者计划”的情况下使用表单 API。

但是,重要的一点是,为了使用 Forms API,需要 link Google Cloud Platform Project 到 Google Apps Script Project。在当前阶段,Google 表格 API 不能与高级 Google 服务一起使用。所以请 link Google 云平台项目到 Google Apps 脚本项目。 Ref 另外,请在 API 控制台启用 Google 表单 API。 Ref

当使用Google表格API时,可以直接达到你的目的。在这种情况下,使用“方法:forms.responses.list”。

function myFunction() {
  const formId = "###"; // Please set your Form ID.

  const url = `https://forms.googleapis.com/v1/forms/${formId}/responses?fields=*&pageSize=5000`;
  const res = UrlFetchApp.fetch(url, { headers: { authorization: "Bearer " + ScriptApp.getOAuthToken() } });
  const obj = JSON.parse(res.getContentText());
  const sorted = obj.responses.sort((a, b) => new Date(a.lastSubmittedTime).getTime() > new Date(b.lastSubmittedTime).getTime() ? -1 : 1);
  const responseId = sorted[0].responseId; // This is the value you expect.

  const link = `https://docs.google.com/forms/d/${formId}/edit#response=${responseId}`;
  console.log(link)
}
  • 在这种情况下,formId 是表单 ID。并且,responseId 的检索值是最后一个响应的响应 ID。
  • 在这种情况下,作为样本,使用pageSize=5000。当有更多回复时,请使用pageToken.
  • 本方法使用https://www.googleapis.com/auth/forms.responses.readonly范围

参考文献: