【问题标题】:apps script stuck in loop?应用程序脚本卡在循环中?
【发布时间】:2020-11-06 16:04:52
【问题描述】:

我的代码可以正常工作,但后来我更改了一些列并更新了脚本。现在该功能似乎陷入了循环。基本上,当向表中添加新行时,我的脚本应该运行一次。 (我通过 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+',32,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+',importrange("https://docs.google.com/spreadsheets/d/###","Form Responses!R:AA"),8,false)');
  phone.setValue('=VLOOKUP("Form Responses_Images/"&B'+lastRow+',importrange("https://docs.google.com/spreadsheets/d/184C3kCDDv2sCElQB-INIyzTvmx8oNDXF0xqO7AH7xs8","Form Responses!R:AA"),9,false)');
  email.setValue('=VLOOKUP("Form Responses_Images/"&B'+lastRow+',importrange("https://docs.google.com/spreadsheets/d/###","Form Responses!R:AA"),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 的值。

这是我的桌子:

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

这是我的处决页面:

【问题讨论】:

  • IFTTT 插入的每一行只调用一次脚本。我不知道脚本执行页面在哪里。最后一行是 IFTTT 添加的行,IFTTT 填充列 A:C。 D:E 列是公式。 F:J 列是通过脚本完成的。

标签: google-apps-script google-sheets triggers onchange


【解决方案1】:

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);
}

【讨论】:

  • 导致循环的不是删除行。当我注释掉 ````` for(var row=lastRow;row>1;row--){ if(ss.getRange('B'+row).isBlank()){ ss.deleteRow(row);} } ````````` 循环仍然发生。
  • 这很奇怪。它看起来正在运行,但执行页面显示脚本仍在运行?
  • 执行页面有点“错误”。尝试刷新相应的网络浏览器标签。
  • @testing123 耶!我很高兴它终于起作用了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2015-10-25
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多