我可以将脚本从表单复制到链接的电子表格吗?
Can I copy a script from a Form to the linked spreadsheet?
我有一个表单模板,我会根据需要对其进行复制、修改和发送以供回复。我已经为链接响应电子表格编写了一个脚本,它以特定方式重新排列响应数据。脚本本身工作正常,它只需要 运行 在我的帐户上。
问题是脚本绑定到电子表格,而不是表单;但它是表格而不是被复制的电子表格。我尝试将我的脚本链接到表单模板并使用下面的代码创建链接的电子表格并将脚本复制过来。我在表单提交时为 运行 这个函数设置了一个触发器,但是当表单模板被复制时触发器就消失了。此代码主要是从以下答案复制而来: 在开头添加了几行以创建链接的电子表格。
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 和 Web 部署完全不熟悉。
所以我的问题是:有没有一种方法可以将脚本从表单复制到新的、表单链接的电子表格?我也很满意某种解决方案将我的脚本(可能是独立的)应用于所有新的电子表格,因为代码创建了一个菜单选项;因此,使脚本成为一个附加组件可能是这里的答案,但对于一个只有一个人会去的脚本来说,这似乎有点过分了运行。
与其将旧脚本从电子表格重新加载到表单,不如保持原样,但将以下脚本添加到您的表单:
function onOpen() {
FormApp.getActiveForm().setDestination(FormApp.DestinationType.SPREADSHEET, 'ID of your destination spreadsheet');
}
- 运行手动执行一次此脚本,以便为脚本提供必要的权限
- 随心所欲地复制您的表单 - 每个副本都将包含一份脚本
- 该脚本将触发 onFormOpen 并将相应表单副本的 destination 设置为同一电子表格 - 包含您的重新排列脚本的电子表格
- 来自不同表单的表单回复将自动插入到电子表格的不同工作表中
我有一个表单模板,我会根据需要对其进行复制、修改和发送以供回复。我已经为链接响应电子表格编写了一个脚本,它以特定方式重新排列响应数据。脚本本身工作正常,它只需要 运行 在我的帐户上。
问题是脚本绑定到电子表格,而不是表单;但它是表格而不是被复制的电子表格。我尝试将我的脚本链接到表单模板并使用下面的代码创建链接的电子表格并将脚本复制过来。我在表单提交时为 运行 这个函数设置了一个触发器,但是当表单模板被复制时触发器就消失了。此代码主要是从以下答案复制而来: 在开头添加了几行以创建链接的电子表格。
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 和 Web 部署完全不熟悉。
所以我的问题是:有没有一种方法可以将脚本从表单复制到新的、表单链接的电子表格?我也很满意某种解决方案将我的脚本(可能是独立的)应用于所有新的电子表格,因为代码创建了一个菜单选项;因此,使脚本成为一个附加组件可能是这里的答案,但对于一个只有一个人会去的脚本来说,这似乎有点过分了运行。
与其将旧脚本从电子表格重新加载到表单,不如保持原样,但将以下脚本添加到您的表单:
function onOpen() {
FormApp.getActiveForm().setDestination(FormApp.DestinationType.SPREADSHEET, 'ID of your destination spreadsheet');
}
- 运行手动执行一次此脚本,以便为脚本提供必要的权限
- 随心所欲地复制您的表单 - 每个副本都将包含一份脚本
- 该脚本将触发 onFormOpen 并将相应表单副本的 destination 设置为同一电子表格 - 包含您的重新排列脚本的电子表格
- 来自不同表单的表单回复将自动插入到电子表格的不同工作表中