如何使用 google 应用程序脚本将数组写入工作表列并将自定义公式添加到它旁边的列?
How to write array to sheets column and add custom formula to column next to it using google apps script?
这是问题所在:
从 sheet(股票列表)
中的列获取代码列表
推送它,使每个代码在数组中出现 105 次
将结果数组写入另一个 sheet 的列 (TickersData)
在带到 TickersData 的每个元素的第一个代码旁边,添加公式。
这是代码,我可以在其中重复数组中的值,但不能将它们写入另一个 sheet:
function getGFTickersData() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("LIST OF STOCKS");
var tickerRng = ss.getRange(2, 1, ss.getLastRow(), 1).getValues();
var TDSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TickersData");
var startRow = 2;
var tickerArr = [];
for (var b = 0; b < tickerRng.length; b++) {
var tickerToArr = tickerRng[b];
if (tickerRng[b] != '') {
var repeated = [].concat(... new Array(104).fill([tickerToArr]));
tickerArr.push(repeated);
}
}
Logger.log(tickerArr.length);
TDSheet.getRange(TDSheet.getLastRow() + 1, 1, tickerArr.length, 1).setValues(tickerArr);
var targetRow = TDSheet.getRange("B:B").getValues();
var maxIndex = targetRow.reduce(function (maxIndex, row, index) {
return row[0] === "" ? maxIndex : index;
}, 0);
var row = TDSheet.getRange(maxIndex + 2, 2).setFormula("=query(googlefinance(" + '"' + tickerArr + '"' + ",'all shares'!A4,'all shares'!D3,'all shares'!D4,'all shares'!D5)," + '"' + "select *" + '"' + ",1)");
}
这里以一张自动收报机的图片为例。在 105 行之后,A 列中应该有一个新的代码,并且在 B 列中的旁边添加了公式:
我相信你的目标如下。
- 您想从“LIST OF STOCKS”中检索“A2:A”的值sheet。
- 您希望通过包含第 1 行具有
=query(googlefinance("###",'all shares'!A4,'all shares'!D3,'all shares'!D4,'all shares'!D5),"select *",1)
. 公式的 105 行,将检索到的值放入“Sheet10”sheet
为了实现您的目标,我想提出以下示例脚本。
示例脚本:
function getGFTickersData() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("LIST OF STOCKS");
var tickerRng = ss.getRange(2, 1, ss.getLastRow() - 1, 1).getValues();
var TDSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet10");
var values = tickerRng.flatMap(([a]) => [[a, `=query(googlefinance("${a}",'all shares'!A4,'all shares'!D3,'all shares'!D4,'all shares'!D5),"select *",1)`], ...new Array(104).fill([a, ""])]);
TDSheet.getRange(TDSheet.getLastRow() + 1, 1, values.length, 2).setValues(values);
}
参考:
这是问题所在:
从 sheet(股票列表)
中的列获取代码列表推送它,使每个代码在数组中出现 105 次
将结果数组写入另一个 sheet 的列 (TickersData)
在带到 TickersData 的每个元素的第一个代码旁边,添加公式。
这是代码,我可以在其中重复数组中的值,但不能将它们写入另一个 sheet:
function getGFTickersData() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("LIST OF STOCKS");
var tickerRng = ss.getRange(2, 1, ss.getLastRow(), 1).getValues();
var TDSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TickersData");
var startRow = 2;
var tickerArr = [];
for (var b = 0; b < tickerRng.length; b++) {
var tickerToArr = tickerRng[b];
if (tickerRng[b] != '') {
var repeated = [].concat(... new Array(104).fill([tickerToArr]));
tickerArr.push(repeated);
}
}
Logger.log(tickerArr.length);
TDSheet.getRange(TDSheet.getLastRow() + 1, 1, tickerArr.length, 1).setValues(tickerArr);
var targetRow = TDSheet.getRange("B:B").getValues();
var maxIndex = targetRow.reduce(function (maxIndex, row, index) {
return row[0] === "" ? maxIndex : index;
}, 0);
var row = TDSheet.getRange(maxIndex + 2, 2).setFormula("=query(googlefinance(" + '"' + tickerArr + '"' + ",'all shares'!A4,'all shares'!D3,'all shares'!D4,'all shares'!D5)," + '"' + "select *" + '"' + ",1)");
}
这里以一张自动收报机的图片为例。在 105 行之后,A 列中应该有一个新的代码,并且在 B 列中的旁边添加了公式:
我相信你的目标如下。
- 您想从“LIST OF STOCKS”中检索“A2:A”的值sheet。
- 您希望通过包含第 1 行具有
=query(googlefinance("###",'all shares'!A4,'all shares'!D3,'all shares'!D4,'all shares'!D5),"select *",1)
. 公式的 105 行,将检索到的值放入“Sheet10”sheet
为了实现您的目标,我想提出以下示例脚本。
示例脚本:
function getGFTickersData() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("LIST OF STOCKS");
var tickerRng = ss.getRange(2, 1, ss.getLastRow() - 1, 1).getValues();
var TDSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet10");
var values = tickerRng.flatMap(([a]) => [[a, `=query(googlefinance("${a}",'all shares'!A4,'all shares'!D3,'all shares'!D4,'all shares'!D5),"select *",1)`], ...new Array(104).fill([a, ""])]);
TDSheet.getRange(TDSheet.getLastRow() + 1, 1, values.length, 2).setValues(values);
}