Javascript 谷歌电子表格应用程序脚本不会等待结果加载

Javascript 谷歌电子表格应用程序脚本不会等待结果加载,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我有一个小脚本,我试图做的是将一个值从“表1”写入“表2”。等待结果加载并比较单元格,查看其是否高于10%。我在电子表格中有一些=importhtml函数,加载它需要很长时间。我试过睡觉、睡觉和冲水。可能是因为我把它放错地方了 function compareCells() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var listSheet = ss.getSheetByName('Stocks'); var d

我有一个小脚本,我试图做的是将一个值从“表1”写入“表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函数并不重要,那么最简单的方法就是在应用程序脚本中使用UrlFetchApp。以这种方式获取数据将导致脚本阻塞,直到返回HTML响应。您还可以创建一个基于时间的触发器,这样您的数据总是最新的,并且用户在查看您的工作表时不必等待URL获取

一旦得到HTML响应,就可以在脚本中执行与Sheet1中相同的处理。如果因为在Sheet1中有复杂的处理而无法工作,则可以:

使用urlfetchpap.fetch'http://sample.com/data.html'以检索您的数据 将数据写入表1 调用SpreadsheetApp.flush以强制写入和任何后续处理 按照上面的例子进行
通过在脚本中按顺序处理这些步骤,您可以保证后续步骤不会在数据出现之前发生。

如果您获得这两个值

var value1 = dataSheet.getRange(15, 4).getValue();
var value2 = dataSheet.getRange(22, 4).getValue();
在=importhtml调用之后,必须在这两行代码之前添加sleep函数

您还可以有一个循环,直到您从=importhtml调用中获得一些值,并在循环中添加一些睡眠。另请注意,截至2014年4月,时间限制为6分钟

我还发现这可能会有所帮助


希望有帮助

我也遇到了类似的问题,但我想出了一个解决方案,它使用while循环,强制脚本等待至少添加了一列或一行。因此,要实现这一点,公式需要将数据添加到除包含公式的单元格之外的至少一个额外单元格中,并且需要扩展工作表的数据范围行数或列数,例如,通过将公式添加到工作表的末尾,这与您正在执行的操作类似。每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.');
   }
 }

请发布更多关于使用=importhtml函数导入的值范围的详细信息,以及您是否可以添加包含数据的电子表格进行分析。我正在导入公司的财务报表。我为自己创造了一种估价方法。我希望对整个市场进行评估。基本上,我要做的是,我将有一张带有股票代码列表的表格,我希望脚本将每个代码输入到适当的字段中,然后等待财务报表导入,完成计算大约需要10秒钟,然后检查安全边际是否满足10%。如果它这样做了,那么它将写为true,并移动到下一个,其他人则写为false。如果你想看,请告诉我。你知道这是个不错的主意,但问题是我用这种方法做得太过分了。我从大约4个不同的url导入财务报表,一旦它们被加载,就会有另一张表格,从中提取相关数据,然后是另一张实际进行计算的表格。如果有人真的有兴趣看ig,请告诉我。也许这会让事情变得更简单。我仍然不知道为什么你不能从你刚才描述的4个URL中提取URL来导入财务报表。如果您获取并使用与上面粘贴的处理相同的脚本进行编写,则可以保证在脚本运行时数据在那里,并且您不必更改任何内容。老实说,我在脚本编写方面不是很熟练。我知道excel函数,在使用谷歌工作表的过程中,我真的学到了很多东西。你能再解释一下吗?我没有使用URLFetch的另一个原因是,如果我没有使用脚本,而我只是想查看财务数据,该怎么办。。。