首页 > 解决方案 > onSubmit 触发器:表单的 GetEditResponseUrl 有时执行失败

问题描述

我希望用户能够从此 Google 表单中编辑他们的回复,因此我想将编辑回复网址放在回复表的第 14 列。

我设置了一个触发器,onSubmit。每次用户提交表单时,此函数都会运行。问题是,有时它会起作用并将编辑 URL 设置在第 14 列。但有时它会抛出一个错误:无法调用未定义的方法“getEditResponseUrl”。

意思是:“var rs = f.getResponses(timeStamp)[0];” 在时间戳之后无法获得响应。

我认为这与在 Google 端获取时间戳和延迟有关。我觉得,该函数从(e)获取时间戳,但在该时间戳之后看不到任何响应。

function onSubmit(e){
  var rng = e.range; //Collects active range for event
  var ss = SpreadsheetApp.getActiveSpreadsheet();//collects active spreadsheet object

  var fUrl = ss.getFormUrl();//gets form url linked with active spreadsheet
  var f = FormApp.openByUrl(fUrl);//opens form using form url

   var timeStamp = new Date(e.namedValues.Timestamp[0]);//gets the timestamp of the form response
  var rs = f.getResponses(timeStamp)[0]; //gets the first response after the 

    var row = e.range.getRow();

    var sheet = ss.getSheetByName("All"); // responses sheet
    sheet.getRange(row, 14).setValue(rs.getEditResponseUrl());

}

标签: google-apps-script

解决方案


这对我有用。不完全确定为什么这种方法有效而其他方法无效。也许是因为我直接从工作表中获取时间戳,所以它没有关闭 1 秒。以前,通过使用 e 对象,时间戳将关闭一秒钟。

提交触发器:

function onSubmit(e){
editBillingFormURLEncoded(e.range.getRow()); //pass in row to function
}


function editBillingFormURLEncoded(row){

 var ss = SpreadsheetApp.openById(SheetID).getSheets()[0]; //Open First Sheet in Spreadsheet
  var vals = ss.getRange(row,1,1,15).getValues();
 var timeStamp = vals[0][0]; //first value of sheet is the timestamp

   var googleFormUrl = ss.getFormUrl(); //get form linked to the spreadsheet
   var googleForm = FormApp.openByUrl(googleFormUrl); //FormApp
try{  
  var formResponse = googleForm.getResponses(timeStamp)[0]; //get last response after timestamp
   var responseUrl = formResponse.getEditResponseUrl(); //get the edit form URL
  ss.getRange(row, 14).setValue(responseUrl); //setting the responseURL Value on 14th column of sheet
  }
  catch(error){
  ss.getRange(row, 14).setValue("Failed");
  }
}

推荐阅读