使用 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
设置不同的起始值,但没有得到预期的结果。相反,我得到:
我怎样才能:
- 不覆盖
B1, C1, D1
中的单元格,而是将数据插入 后面 各自的代码?
- 运行 循环不是 5 次(现在是硬编码的),而是只有多少次?我尝试
row <= tickers.length()
但出现错误。
尝试
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"]
}
文档
我有以下 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
设置不同的起始值,但没有得到预期的结果。相反,我得到:
我怎样才能:
- 不覆盖
B1, C1, D1
中的单元格,而是将数据插入 后面 各自的代码? - 运行 循环不是 5 次(现在是硬编码的),而是只有多少次?我尝试
row <= tickers.length()
但出现错误。
尝试
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"]
}