我有一个小脚本,我想要做的是将一个值从'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++;
}
}
答案 0 :(得分:4)
如果在工作表中使用= IMPORTHTML()函数并不重要,最简单的方法是在Apps脚本中使用UrlFetchApp
。以这种方式获取数据将导致脚本阻塞,直到返回HTML响应。您还可以创建基于时间的触发器,以便您的数据始终保持新鲜,并且用户在查看工作表时无需等待URL提取。
获得HTML响应后,您可以在脚本中的Sheet1中执行所有相同的处理。如果由于您在Sheet1中进行了复杂处理而无法工作,您可以:
UrlFetchpApp.fetch('http://sample.com/data.html')
检索您的数据SpreadsheetApp.flush()
强制执行写入以及后续处理通过在脚本中按顺序处理这些步骤,可以保证在数据出现之前不会执行后续步骤。
答案 1 :(得分:1)
如果你得到这两个值(
var value1 = dataSheet.getRange(15, 4).getValue();
var value2 = dataSheet.getRange(22, 4).getValue();
)在=importhtml
调用之后,你必须在这两行代码之前添加sleep函数。
你也可以有一个循环,直到你从=importhtml
调用的范围内获得一些值并在循环中添加一些睡眠。另请注意,截至2014年4月,script runtime的限制为6分钟。
我也发现这个link可能会有所帮助。
希望有所帮助!
答案 2 :(得分:1)
我遇到了类似的问题,但提出了一个使用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.');
}
}