我有一个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脚本或其他配置来生成指向我的输出工作表中每个单独响应的链接?
答案 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|
+-----------+------------+------------------------------------------------------------+
您希望看到只读的响应页面。
如果我的理解是正确的,那么以下解决方法如何?
toPrefilledUrl()
可以提交。因此它不是只读页面。不幸的是,在上述情况下,需要考虑解决方法。在这种解决方法中,我使用了toPrefilledUrl()
和Web Apps。此解决方法的流程如下。
toPrefilledUrl()
检索的URL用作查询参数。toPrefilledUrl()
的URL中检索HTML数据,并删除“提交”按钮。然后,打开已编辑的HTML。通过这种方式,可以显示只读响应。
为了使用此替代方法,请执行以下流程。
请打开要使用的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);
}
Only myself
,则只有您可以访问Web Apps。那时,请使用您的访问令牌。myFunction()
。这样,将创建新的电子表格。这样,Web Apps就会运行,您可以看到带有只读内容的响应页面。