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
范围
参考文献:
我正在尝试为我的 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
范围