如何使用Google Sheet = importxml函数解决#N / A值

时间:2015-10-17 11:51:48

标签: google-apps-script google-sheets

我有一张表要使用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);
      }

1 个答案:

答案 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分钟运行一次或者需要什么