繁体   English   中英

Google Spreadsheet App Script不会等待结果加载

[英]Google Spreadsheet App Script will not wait for results to load

我有一个小脚本,我想做的是将一个值从“ Sheet 1”写入“ Sheet 2”。 等待结果加载并比较单元格以查看其是否高于10%。 我在电子表格中有一些=importhtml函数,需要花费一些时间才能加载。 我试过睡眠,公用事业睡眠和冲洗。 没有一个工作,也许是因为我可能把它放在错误的地方。

function compareCells() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var listSheet = ss.getSheetByName('Stocks');
    var dataSheet = ss.getSheetByName('Summary');
    var listSheetLastRow = listSheet.getLastRow();
    var currRow = 1;
    for (i = 1; i <= listSheetLastRow; i++) {
        if (listSheet.getRange(1, 3).getValue() == 'asd') {
            var ticker = listSheet.getRange(currRow, 1).getValue();
            dataSheet.getRange(5, 4).setValue(ticker);
            var value1 = dataSheet.getRange(15, 4).getValue();
            var value2 = dataSheet.getRange(22, 4).getValue();
            SpreadsheetApp.flush();
            if (value1 > 0.10 && value2 > 0.10) {
                listSheet.getRange(currRow, 8).setValue('True');
                listSheet.getRange(currRow, 9).setValue(value1);
                listSheet.getRange(currRow, 10).setValue(value2);
            } else {
                listSheet.getRange(currRow, 8).setValue('False');
            }
        } else {
            Browser.msgBox('Script aborted');
            return null;
        }
        currRow++;
    }
}

如果在工作表中使用= IMPORTHTML()函数并不重要,则最简单的方法是在Apps脚本中使用UrlFetchApp 以这种方式获取数据将导致脚本阻塞,直到返回HTML响应。 您还可以创建基于时间的触发器,以便您的数据始终保持最新状态,并且用户在查看工作表时不必等待URL提取。

收到HTML响应后,就可以执行脚本中Sheet1中的所有相同处理。 如果由于在Sheet1中进行了复杂的处理而无法解决问题,则可以:

  1. 使用UrlFetchpApp.fetch('http://sample.com/data.html')检索您的数据
  2. 将数据写入Sheet1
  3. 调用SpreadsheetApp.flush()强制进行写入以及任何后续处理
  4. 按照上述示例进行操作

通过在脚本中顺序处理这些步骤,可以确保以后的步骤不会在数据出现之前发生。

如果您得到这两个值(

var value1 = dataSheet.getRange(15, 4).getValue();
var value2 = dataSheet.getRange(22, 4).getValue();

),在=importhtml调用之后,您必须在这两行代码之前添加sleep函数。

您也可以进行循环,直到从=importhtml调用中获得一些值并在循环中添加一些睡眠=importhtml 另请注意,自2014年4月起, 脚本运行时限制为6分钟。

我还发现此链接可能会有所帮助。

希望有帮助!

我有一个类似的问题,但是想出了一个使用while循环的解决方案,该循环强制脚本等待直到至少添加了1个额外的列或1个额外的行。 因此,要执行此操作,公式需要将数据添加到除包含公式的单元格以外的至少一个额外的单元格中,并且它需要扩展工作表的数据范围(行数或列数),例如通过将公式添加到工作表的末尾,看起来就像您在做什么。 每0.5秒保持10秒,它会检查是否已添加额外的单元格。

 dataSheet.getRange(5, 4).setValue(ticker);            
 var wait = 0;
 var timebetween = 500;
 var timeout = 10000; 
 var lastRow = dataSheet.getLastRow();
 var lastColumn = dataSheet.getLastColumn();
 while (dataSheet.getLastColumn() <= lastColumn && dataSheet.getLastRow() <= lastRow){
   Utilities.sleep(timebetween);
   wait += timebetween;
   if (wait >= timeout){
     Logger.log('ERROR: Source data for ' + ticker + ' still empty after ' + timeout.toString() + ' seconds.');
     throw new Error('Source data for ' + ticker + ' still empty after ' + timeout.toString() + ' seconds.');
   }
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM