我有一个表单模板,可以根据需要复制,修改和发送响应。我为链接的响应电子表格编写了一个脚本,该脚本以特定的方式重新排列了响应数据。该脚本本身可以正常工作,并且只需要在我的帐户上运行即可。
问题在于脚本是绑定到电子表格的,而不是表单的;但这是表格,而不是重复的电子表格。我尝试将脚本链接到表单模板,并使用下面的代码创建链接的电子表格并复制脚本。我设置了一个触发器以在表单提交上运行此功能,但是当表单模板重复时,该触发器消失了。这段代码大部分是从以下答案中复制的:https://stackoverflow.com/a/48353155/12131953,并在开头添加了几行以创建链接的电子表格。
function copyScript() {
//create destination spreadsheet
var form = FormApp.getActiveForm();
var ss = SpreadsheetApp.create(form.getTitle() + " (Responses)");
form.setDestination(FormApp.DestinationType.SPREADSHEET, ss.getId());
var srcProjectId = "###my project id###"; // Source project ID
var dstGoogleDocsId = ss.getId(); // Destination spreadsheet ID
var baseUrl = "https://script.googleapis.com/v1/projects";
var accessToken = ScriptApp.getOAuthToken();
// Retrieve filename of bound-script project.
var srcName = JSON.parse(UrlFetchApp.fetch(baseUrl + "/" + srcProjectId, {
method: "get",
headers: {"Authorization": "Bearer " + accessToken}
}).getContentText()).title;
// Retrieve bound-script project.
var obj = UrlFetchApp.fetch(baseUrl + "/" + srcProjectId + "/content", {
method: "get",
headers: {"Authorization": "Bearer " + accessToken}
}).getContentText();
// Create new bound script and retrieve project ID.
var dstId = JSON.parse(UrlFetchApp.fetch(baseUrl, {
method: "post",
contentType: 'application/json',
headers: {"Authorization": "Bearer " + accessToken},
payload: JSON.stringify({"title": srcName, "parentId": dstGoogleDocsId})
}).getContentText()).scriptId;
// Upload a project to bound-script project.
var res = JSON.parse(UrlFetchApp.fetch(baseUrl + "/" + dstId + "/content", {
method: "put",
contentType: 'application/json',
headers: {"Authorization": "Bearer " + accessToken},
payload: obj
}).getContentText());
}
然后,当打开重复的表单时,我尝试以编程方式创建触发器,但据我所知,创建可安装触发器不在简单触发器onOpen的授权范围内。
function onOpen(); {
ScriptApp.newTrigger("copyScript").forForm(FormApp.getActiveForm()).onFormSubmit().create();
.
.
.
}
我不是开发人员,并且对这些东西自学;我对脚本编写方面非常满意,但对API和网络部署完全不熟悉。
所以我的问题是:是否可以将脚本从表单复制到新的,与表单链接的电子表格?我也可以通过某种方式应用我的脚本(也许作为独立版本),因为所有代码都创建了一个菜单选项;因此将脚本添加为附件可能是解决问题的方法,但这似乎对于只运行一个人的脚本来说是过大的选择。
答案 0 :(得分:0)
function onOpen() {
FormApp.getActiveForm().setDestination(FormApp.DestinationType.SPREADSHEET, 'ID of your destination spreadsheet');
}