应用脚本陷入循环?

问题描述

我的代码可以正常工作,但是后来我在一些专栏中进行了更改并更新了脚本。现在,该函数似乎陷入了循环。基本上,当向表中添加新行时,我的脚本应该运行一次。 (我通过IFTTT触发器添加了新行。)预定使用以下函数来触发onchange()

function phototable() {
  var ss = SpreadsheetApp.openById('###').getSheetByName('IFTTT');
  var lastRow = ss.getLastRow();
  var imageID = 'MID(C'+lastRow+',32,33)';
  var name = ss.getRange('G'+lastRow);
  var address = ss.getRange('H'+lastRow);
  var phone = ss.getRange('I'+lastRow);
  var email = ss.getRange('J'+lastRow);
  ss.getRange('D'+lastRow).setValue('=HYPERLINK(CONCATENATE("https://drive.google.com/file/d/"&'+imageID+'),'+imageID+')');    //ss.getRange('D'+lastRow).setFormula('MID(C'+lastRow+',33)');
  ss.getRange('E'+lastRow).setFormula('LEFT(B'+lastRow+',8)');
  name.setValue('=VLOOKUP("Form Responses_Images/"&B'+lastRow+',importrange("https://docs.google.com/spreadsheets/d/###","Form Responses!R:AA"),7,false)');
  address.setValue('=VLOOKUP("Form Responses_Images/"&B'+lastRow+',8,false)');
  phone.setValue('=VLOOKUP("Form Responses_Images/"&B'+lastRow+',importrange("https://docs.google.com/spreadsheets/d/184C3kCDDv2sCElQB-INIyzTvmx8oNDXF0xqO7AH7xs8",9,false)');
  email.setValue('=VLOOKUP("Form Responses_Images/"&B'+lastRow+',10,false)');
  SpreadsheetApp.flush();
  name.copyTo(name,{contentsOnly:true});
  address.copyTo(address,{contentsOnly:true});
  phone.copyTo(phone,{contentsOnly:true});
  email.copyTo(email,{contentsOnly:true});
  
  
 var key = ss.getRange('F'+lastRow);
  key.setValue('=DEC2HEX(RANDBETWEEN(0,4294967295),8)');    
  SpreadsheetApp.flush();
  key.copyTo(key,{contentsOnly:true});
  
  for(var row=lastRow;row>1;row--){
    if(ss.getRange('B'+row).isBlank()){
      ss.deleteRow(row);}
  }
  
}

该脚本运行并产生正确的值,但由于它不断创建新的key并检索G:J列的值,因此似乎陷入了永无止境的循环。

这是我的桌子:

enter image description here

有什么想法吗?我改用了onedit()触发器,但实际上并没有触发该函数

这是我的处决页面

enter image description here

解决方法

ss.deleteRow(row)可能触发您的变更触发。另一种可能的情况是,IFTTT会多次触发on on change触发器。无论如何,请尝试以下操作:

替换

function phototable(){ 

作者

function phototable(e){
  if(e.changeType !== 'INSERT_ROW') return;

以上内容将使其余代码仅在插入新行时执行。

副作用是您将无法直接执行该功能,但可以使用以下内容

function test_phototable(){
  var e = {changeType:'INSERT_ROW'};
  phototable(e);
}