2017-01-01 68 views
0

我有一个Google表格脚本,它将提交的表单数据的元素复制到另一个电子表格,然后转换某些数据以供单独使用。当我手动运行脚本时,脚本完美地工作,但我希望脚本自动运行。Google表格脚本不会在表单提交中运行

有许多表单连接到这个电子表格,所有表单都在不同的时间提交数据。

所以,我有点有两个问题:

  1. 如何让我的脚本来自动运行?我创建了一个触发器从电子表格在表单提交,但它永远不会运行。
  2. 我如何确保它仅在以下情况下运行:或者是提交了特定的表单,或是特定表单中添加了新行?

网络上有很多文章都有答案,但很多都是3年前的文章,看起来Sheets,Forms和Script Editor的工作方式从那时起就有很大变化。

回答

1

您需要一个onFormSubmit函数以及 可安装触发器。

如果您使用的是Html服务表单,您可以从表单事件 输出中获取目标表单的名称 。您无法使用电子表格中的 创建表单。我能够做的最好的事情是 ,用于将事件时间戳与 表格回复表的最后一行的时间戳进行比较,以确定哪些 表已更新。这不是完全的傻瓜证明,因为 多个表单可能同时在 提交(但不太可能)。

试试这个:

//installable trigger also needed. 
function onFormSubmit(e){ 
var ts=e.namedValues.Timestamp 
findResponseForm(ts) 
} 

function findResponseForm(ts) { 
var ss=SpreadsheetApp.getActiveSpreadsheet() 
var s=ss.getSheetByName('Form Responses 1') //get 'Form Responses 1' sheet 
var lr=s.getLastRow() //get last row number of 'Form Responses 1' sheet 
var s1=ss.getSheetByName('Form Responses 2') //get 'Form Responses 2' sheet 
var lr1=s1.getLastRow() //get last row number of 'Form Responses 2' sheet 
var time1=s.getRange(lr, 1, 1,1).getValue() //get 'Form Responses 1'last Timestamp 
var ftime1=Utilities.formatDate(time1, "GMT-6", "d/M/yyyy' 'HH:mm:ss") //convert 'Form Responses 1'last Timestamp format to form Timestamp format 
var time2=s1.getRange(lr1, 1, 1,1).getValue() //get 'Form Responses 2'last Timestamp 
var ftime2=Utilities.formatDate(time2, "GMT-6", "d/M/yyyy' 'HH:mm:ss") //convert 'Form Responses 1'last Timestamp format to form Timestamp format 
if(ts==ftime1){ //if date/time match 
    Logger.log('Form Responses 1') 
    //call function to prosses 'Form Responses 1' data 
} 
    else if(ts==ftime2){ //if date/time match 
    Logger.log('Form Responses 2') 
    //call function to prosses 'Form Responses 2' data 
    //Add more 'else if' if more forms are involved. 
    } 
} 
+0

埃德嗨, 谢谢您的回复,我已经更新了我的代码,并可以测试onFormSubmit运行时,它运行在正确的纸张脚本。我遇到的挑战是,当我使用Google表单提交表单时,表单将以通常方式填充电子表格,但我的脚本将无法运行。 我还需要做什么才能让脚本运行?我必须以某种方式部署/发布吗?我试图发布它,但可用的选项与我正在尝试做的不匹配。 –