使用 Google 脚本更新 Google 工作表中的行

Updating rows in Google Sheets using Google script

我有以下 Google Sheet 和一个名为 db 的选项卡:

实际上,列表要长得多。最终,我想每小时触发一个功能,从 Yahoo! 下载 50 家公司的数据。财务,至于不受利率限制。

我目前正在开发这个功能,在Code.gs中有以下内容:

function trigger() {
  var db =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('db'); 
  var tickers = db.getRange('A2:A').getValues();

  for (var row = 1; row <= 5; row++) { 
    console.log(tickers[row])
    var data = yahoo(tickers[row]);
    db.getRange(row, 2, 1, 3).setValues(data);
  }
}

我一直在为 row 设置不同的起始值,但没有得到预期的结果。相反,我得到:

我怎样才能:

尝试

function trigger() {
  var db = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('db');
  var tickers = db.getRange('A2:A' + db.getLastRow()).getValues().flat();

  for (var row = 0; row < tickers.length; row++) {
    console.log(tickers[row])
    var data = yahoo(tickers[row]);
    db.getRange(row + 2, 2, 1, 3).setValues(data);
  }
}

说明:数组(tickers)的索引从0开始,不是1,所以,当我们捕捉到第2行的tickers时,必须加2才能得到对应的ticker。

当使用getRange(row, column, numRows, numColumns)方法时,请记住数字1对应第1行,所以如果你不想覆盖headers,你必须在2初始化它。

同样重要的是,您使用的方法效率非常低,因为每次循环迭代时您都在调用该服务。如果您打算每小时调用此脚本,您可以 exceed the quotas. So I recommend that you use setValues(values).

这里有一些 pseudo-code 可能会对您有所帮助。

const sS = SpreadsheetApp.getActiveSheet()

function fillWithoutLoops() {
  const tickers = sS.getRange('A2:A').getValues().flat().filter(n => n)
  const tickersParsed = tickers.map(yahoo)
  sS
    .getRange(2, 1, tickersParsed.length, tickersParsed[0].length)
    .setValues(tickersParsed)
}

function yahoo(ticker) {
  return [ticker, "SOME", "DATA", "MORE"]
}

文档