【问题标题】:Can I copy a script from a Form to the linked spreadsheet?我可以将脚本从表单复制到链接的电子表格吗?
【发布时间】:2019-09-27 17:32:26
【问题描述】:

我有一个表单模板,我将根据需要对其进行复制、修改和发送以供回复。我为链接响应电子表格编写了一个脚本,它以特定方式重新排列响应数据。脚本本身运行良好,只需要在我的帐户上运行。

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

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

【问题讨论】:

  • 欢迎。查看“表单服务”文档中的Enum DestinationType。它包括一个创建新电子表格然后将表单目标设置为该电子表格的示例。

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


【解决方案1】:

不要将旧脚本从电子表格反弹到表单中,而是保持原样,但将以下脚本添加到表单中:

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

【讨论】:

  • 我很欣赏这种创造性思维,但在我的情况下,每个重复的表格都代表一个新项目,该项目正在移交给另一个部门,所以我实际上需要将每个表格放在一个完全独立的电子表格中,而不是放在不同的工作表中同一个电子表格。
  • 您可以编写另一个脚本,将每个工作表同步到单独的电子表格中
  • 这就是我最终实现的。感谢您的帮助!
猜你喜欢
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
相关资源
最近更新 更多