Google apps script 谷歌表单脚本从第1000行开始?

Google apps script 谷歌表单脚本从第1000行开始?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个GoogleSheet脚本来为提交的googleforms生成URL。脚本一直运行良好,但现在提交的数量大幅增加,我不断收到“超出最大执行时间”的消息 如何使脚本从1000行开始循环?还是N线 或 如何使循环从上次更新的响应开始 function onOpen(){ var menu = SpreadsheetApp.getUi(); menu.createMenu('Get URLs') .addItem('Iniciar ', 'GetURL') .addToU

我有一个GoogleSheet脚本来为提交的googleforms生成URL。脚本一直运行良好,但现在提交的数量大幅增加,我不断收到“超出最大执行时间”的消息

如何使脚本从1000行开始循环?还是N线

如何使循环从上次更新的响应开始

function onOpen(){
  var menu = SpreadsheetApp.getUi();
  menu.createMenu('Get URLs')
     .addItem('Iniciar ', 'GetURL')
  .addToUi();
}

function GerarURL() {
 var formId = Browser.inputBox('https://docs.google.com/forms/d/xxxxxxxx/edit#responses', Browser.Buttons.OK)
 if (formId == ''){
  var formId = Browser.inputBox('URL not informed', Browser.Buttons.OK_CANCEL);
 } else {
  formId.toString();
  var formulario = FormApp.openByUrl(formId)
  var planilha = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var dados = planilha.getDataRange().getValues();
  var respostas = formulario.getResponses();
   var coluna = planilha.getRange(Browser.inputBox('GG:GG',
                                                   Browser.Buttons.OK_CANCEL)).getColumn();
  var hora = [];
  var urls = [];
  var set = [];
  for(var i=0; i<respostas.length; i++){
   hora.push(respostas[i].getTimestamp().setSeconds(0));
   urls.push(respostas[i].getEditResponseUrl());
  }
  for (var x = 1; x< dados.length; x++){
   if(dados[x][0]){
    set.push([urls[hora.indexOf(dados[x][0].setSeconds(0))]]);
   } else {
    [''];
   };
   planilha.getRange(2, coluna, set.length).setValues(set);
  }
 }
}
函数onOpen(){ var menu=SpreadsheetApp.getUi(); createMenu('获取URL') .addItem('Iniciar','GetURL') .addToUi(); } 函数GerarURL(){ var formId=Browser.inputBox('https://docs.google.com/forms/d/xxxxxxxx/edit#responses,Browser.Buttons.OK) 如果(formId=''){ var formId=Browser.inputBox('URL未通知',Browser.Buttons.OK\u取消); }否则{ formId.toString(); var formulario=FormApp.openByUrl(formId) var planilha=SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; var dados=planilha.getDataRange().getValues(); var respostas=formulario.getResponses(); var coluna=planilha.getRange(Browser.inputBox('GG:GG'), Browser.Buttons.OK_CANCEL().getColumn(); var hora=[]; var url=[]; var集=[];
对于(var i=0;i首先,您应该通过向函数传递一个参数来限制响应的日期:(您将只在该日期之后获得响应。)

其次,将最后处理的日期存储在
属性服务
或表单中

//为属性“last”为空时提供默认值
var last=PropertiesService.getScriptProperties().getProperty(“last”)||“2019-08-01”;
var respostas=formulario.getResponses(新日期(最后));
//完成时
var dateString=Utilities.formatDate(新日期(),“美国/纽约”,“YYYY-MM-dd”);
PropertiesService.getScriptProperties().setProperty(“last”,日期字符串);

首先,您应该通过向函数传递一个参数来限制响应的日期:(您将只在该日期之后获得响应。)

其次,将最后处理的日期存储在
属性服务
或表单中

//为属性“last”为空时提供默认值
var last=PropertiesService.getScriptProperties().getProperty(“last”)||“2019-08-01”;
var respostas=formulario.getResponses(新日期(最后));
//完成时
var dateString=Utilities.formatDate(新日期(),“美国/纽约”,“YYYY-MM-dd”);
PropertiesService.getScriptProperties().setProperty(“last”,日期字符串);
如果您想通过只向具有相应时间戳的行插入最后一个响应URL来减少执行时间,您可以这样做: 函数onOpen(){ var menu=SpreadsheetApp.getUi(); createMenu('获取URL') .addItem('Iniciar','GetURL') .addToUi(); } 函数GerarURL(){ var formId=Browser.inputBox('https://docs.google.com/forms/d/xxxxxxxx/edit#responses,Browser.Buttons.OK) 如果(formId=''){ var formId=Browser.inputBox('URL未通知',Browser.Buttons.OK\u取消); }否则{ formId.toString(); var formulario=FormApp.openByUrl(formId) var planilha=SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; var dados=planilha.getRange(1,1,planilha.getLastRow(),1).getValues(); var zeroSeconds=[] 对于(var i=0;ii)如果您希望通过仅向具有相应时间戳的行插入最后一个响应URL来减少执行时间,可以这样做: 函数onOpen(){ var menu=SpreadsheetApp.getUi(); createMenu('获取URL') .addItem('Iniciar','GetURL') .addToUi(); } 函数GerarURL(){ var formId=Browser.inputBox('https://docs.google.com/forms/d/xxxxxxxx/edit#responses,Browser.Buttons.OK) 如果(formId=''){ var formId=Browser.inputBox('URL未通知',Browser.Buttons.OK\u取消); }否则{ formId.toString(); var formulario=FormApp.openByUrl(formId) var planilha=SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; var dados=planilha.getRange(1,1,planilha.getLastRow(),1).getValues(); var zeroSeconds=[]
对于(var i=0;Ith),函数每次运行时都会处理每个formResponse。因此,如果您有一百万个响应,然后得到一个新响应,它将处理整个一百万个响应。一个选项可能是在最后更新的URL处启动循环-也就是说,只处理“new”回答。那太完美了!我该怎么做呢?我建议你先看一下执行记录,看看占用的时间最长的地方。嗯,我试着通过谷歌找到我的方法,但无法找到运行脚本的方法,然后转到
查看>执行记录
查看最长的时间,每一步都有一个步骤它旁边的时间如下:[0.0015秒],使用此选项,您可以看到代码的哪些部分需要改进。该函数每次运行时都会处理每个formResponse。因此,如果您有一百万个响应,然后得到一个新响应,它将处理整个一百万个响应。一个选项可能是在最后更新的URL处启动循环-也就是说,仅处理“新建”回答。那太完美了!我该怎么做呢?我建议你先看一下执行记录,看看占用的时间最长的地方。嗯,我试着通过谷歌找到我的方法,但无法找到运行脚本的方法,然后转到
查看>执行记录
查看最长的时间,每一步都有一个步骤它旁边的时间如下:[0.0015秒],使用此选项,您可以看到代码的哪些部分需要改进。太好了!我感谢您的帮助。我将在我的下一个项目中提供此提示。非常感谢!太好了!我感谢您的帮助。我将在我的下一个项目中提供此提示。非常感谢!非常感谢您的帮助!我遵循您的思路,但再次确认您的代码对我无效。我明白了显示“setSeconds”的错误消息不是r
function onOpen(){
  var menu = SpreadsheetApp.getUi();
  menu.createMenu('Get URLs')
     .addItem('Iniciar ', 'GetURL')
  .addToUi();
}

function GerarURL() {
 var formId = Browser.inputBox('https://docs.google.com/forms/d/xxxxxxxx/edit#responses', Browser.Buttons.OK)
 if (formId == ''){
  var formId = Browser.inputBox('URL not informed', Browser.Buttons.OK_CANCEL);
 } else {
  formId.toString();
  var formulario = FormApp.openByUrl(formId)
  var planilha = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var dados = planilha.getRange(1,1,planilha.getLastRow(),1).getValues();
  var zeroSeconds=[]
  for(var i=0; i<dados.length;i++)
  {
zeroSeconds.push(dados[i][0].setSeconds(0))
  }
  var respostas = formulario.getResponses();
  var coluna = planilha.getRange(Browser.inputBox('GG:GG', Browser.Buttons.OK_CANCEL)).getColumn();
  var hora =respostas[respostas.length-1].getTimestamp().setSeconds(0);
  var url = respostas[respostas.length-1].getEditResponseUrl();
   if(zeroSeconds.indexOf(hora)!=(-1)){
    planilha.getRange(zeroSeconds.indexOf(hora)+1, coluna).setValue(url);
  }
 }
}