我有一张表要使用importxml函数导入Google搜索结果的值。有时我会在A2单元格中获得#N / A.
我使用while循环来继续尝试获取数据,即使我等了很长时间,我仍然无法获取数据。是否可以设置JavaScript计时器,直到我在单元格A2中获取值然后计时器停止并允许其余代码继续?
我应该怎么做才能避免这种情况并始终在A2上获得价值?任何替代解决方案?
var queryString = Math.random();
var cellFunction1 = '=IMPORTXML("' + SpreadsheetApp.getActiveSheet().getRange('C2').getValue() + '&randomNumber=' + queryString + '","'+ SpreadsheetApp.getActiveSheet().getRange('D2').getValue() + '")';
SpreadsheetApp.getActiveSheet().getRange('A2').setValue(cellFunction1);
var stop = 0;
while (SpreadsheetApp.getActiveSheet().getRange('A2').getValue() === "#N/A" && stop++<10) {
Utilities.sleep(5000);
var queryString3 = Math.random();
var cellFunction1 = '=IMPORTXML("' + SpreadsheetApp.getActiveSheet().getRange('C2').getValue() + '&randomNumber=' + queryString3 + '","'+ SpreadsheetApp.getActiveSheet().getRange('D2').getValue() + '")';
SpreadsheetApp.getActiveSheet().getRange('A2').setValue(cellFunction1);
}
答案 0 :(得分:1)
我遇到了同样的问题。我怀疑这是因为在从IMPORTXML更新单元格的值之前,代码会尝试从单元格中获取.getValue。
我的解决方法是编写两个单独的函数,一个用于强制IMPORTXML刷新,另一个用于将数据写入工作表。然后我给IMPORTXML一个触发器,每5分钟运行一次,然后写入函数有自己的触发器。
您可能想尝试一下:
function refresher() {
var ss = SpreadsheetApp.getActiveSheet();
var sheet = ss.getSheetById("input");
// Cell input!A2 holds the formula '=IMPORTXML(A1, XMLpath)'
//So now we give input!A1 a URL with a random ?number behind...
//...to force IMPORTXML to refresh
sheet.getRange(1, 1)
.setValue("http://www.urlWhereInfoResides.com/?" + Math.floor(Math.random() * 40));
}
^给refresher()一个触发器,每5分钟运行一次
function writer() {
var ss2 = SpreadsheetApp.getActiveSheet();
//assumes desired value sits in cell input!A2
var input = ss2.getSheetById("input")
.getRange(2, 1)
.getValue();
//adds input value into a new row in output sheet
var outputSheet = ss2.getSheetById("output");
var output = outputSheet.getRange(outputSheet.getLastRow() + 1, 1)
.setValue(input);
}
^给writer()一个触发器,每5分钟运行一次或者需要什么