Google apps script 谷歌表单脚本从第1000行开始?
我有一个GoogleSheet脚本来为提交的googleforms生成URL。脚本一直运行良好,但现在提交的数量大幅增加,我不断收到“超出最大执行时间”的消息 如何使脚本从1000行开始循环?还是N线 或 如何使循环从上次更新的响应开始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
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);
}
}
}