我可以将脚本从表单复制到链接的电子表格吗?

时间:2019-09-27 17:32:26

标签: google-apps-script google-sheets google-form

我有一个表单模板,可以根据需要复制,修改和发送响应。我为链接的响应电子表格编写了一个脚本,该脚本以特定的方式重新排列了响应数据。该脚本本身可以正常工作,并且只需要在我的帐户上运行即可。

问题在于脚本是绑定到电子表格的,而不是表单的;但这是表格,而不是重复的电子表格。我尝试将脚本链接到表单模板,并使用下面的代码创建链接的电子表格并复制脚本。我设置了一个触发器以在表单提交上运行此功能,但是当表单模板重复时,该触发器消失了。这段代码大部分是从以下答案中复制的: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和网络部署完全不熟悉。

所以我的问题是:是否可以将脚本从表单复制到新的,与表单链接的电子表格?我也可以通过某种方式应用我的脚本(也许作为独立版本),因为所有代码都创建了一个菜单选项;因此将脚本添加为附件可能是解决问题的方法,但这似乎对于只运行一个人的脚本来说是过大的选择。

1 个答案:

答案 0 :(得分:0)

与其将旧脚本从电子表格中退回至表单,请保持原样,而是将以下脚本添加到表单中:

function onOpen() {
  FormApp.getActiveForm().setDestination(FormApp.DestinationType.SPREADSHEET, 'ID of your destination spreadsheet'); 
}
  • 手动运行一次此脚本,以便为脚本提供必要的权限
  • 尽可能多地复制表格-每个副本将包含脚本的副本
  • 该脚本将在onFormOpen上触发并将相应表单副本的destination设置到同一电子表格-包含您重新排列的脚本的电子表格
  • 来自不同表单的表单响应将自动插入到电子表格的不同工作表中