我试图获取 X 和 Y 值的数据范围,并将第三列的值放入另一个电子表格中,使用 X 和 Y 值作为单元格范围。如何使用 .map()
方法利用数组来完成一系列任务?我唯一真正的选择是使用“for 循环”,它在处理多行数据时可能会非常慢?
我尝试并成功地利用“for循环”函数在一张纸中逐一查找每列中的值,并在另一张纸中绘制第三列值。但是,列表越大,过程就越慢
function testMap() {
//Open Active Spreadsheet App
var ss = SpreadsheetApp.getActive();
//Capture sheets by name
var sheetCoord = ss.getSheetByName('Coordinates');
var sheetPlots = ss.getSheetByName('Plots');
//Create last row and column variables
var lR = sheetCoord.getLastRow();
var lC = sheetCoord.getLastColumn();
lR = lR-1;
//Create array of all data
var data = sheetCoord.getRange(2, 1, lR, lC).getValues();
//Create variables for placement into proper sheet
var x = data.map(function(f){ return f[0] });
var y = data.map(function(f){ return f[1] });
var v = data.map(function(f){ return f[2] });
sheetPlots.getRange(y, x, lR, lC).setValues(v);
}
我希望这能够映射范围内的值,而不是逐步获取每个范围的每个值并在绘图表上的坐标中绘制“v”单元格值。它只是说
"Cannot convert 6,2,1 to (class). (line 23, file "Code")".
最佳答案
- 您希望使用从电子表格中检索到的坐标将值放入单元格。
- 坐标表的“A”、“B”和“C”列分别是列号、行号和值。
如果我的理解是正确的,这个答案怎么样?
问题:
- 您的脚本的问题是使用
getRange(row, column, numRows, numColumns)
的row
和column
作为数组。 The official document ofgetRange(row, column, numRows, numColumns)
如下所述。
- row: Integer
- The starting row index of the range; row indexing starts with 1.
- column: Integer
- The starting column index of the range; column indexing starts with 1.
- numRows: Integer
- The number of rows to return.
- numColumns: Integer
- The number of columns to return.
- 在您的情况下,似乎需要将值放入每个坐标的单元格中。这样,当数据量很大时,处理成本就会变高。
- 不幸的是,当使用电子表格服务的
setValues
时,值被放入连续坐标。这不能用于将值放入离散坐标的情况。 - 例如,如果您的目标可以使用单元格被包含空值的值覆盖的情况,则可以使用
setValues()
。
- 不幸的是,当使用电子表格服务的
解决方案:
为了解决上述问题,我建议使用Sheets API的batchUpdate方法。使用 Sheets API 时,可以通过一次 API 调用将值放入离散坐标的单元格中。和from my experiment ,对于输入值,当数据很大时,Sheets API比电子表格服务更快。鉴于这种情况,我建议使用Sheets API。
修改后的脚本:
在使用此脚本之前,请启用 Sheets API Advanced Google Services .
function testMap() {
var ss = SpreadsheetApp.getActive();
var sheetCoord = ss.getSheetByName('Coordinates');
var sheetPlots = ss.getSheetByName('Plots');
var lR = sheetCoord.getLastRow();
var lC = sheetCoord.getLastColumn();
lR = lR-1;
var data = sheetCoord.getRange(2, 1, lR, lC).getValues();
// I modified below script.
var sheetId = sheetPlots.getSheetId();
var requests = data.map(function(e) {
var obj = {};
if (typeof e[2] == "string") obj.stringValue = e[2];
if (typeof e[2] == "number") obj.numberValue = e[2];
return {updateCells: {
range: {sheetId: sheetId, startRowIndex: e[1] - 1, endRowIndex: e[1], startColumnIndex: e[0] - 1, endColumnIndex: e[0]},
rows: [{values: [{userEnteredValue: obj}]}],
fields: "userEnteredValue"
}};
});
Sheets.Spreadsheets.batchUpdate({requests: requests}, ss.getId());
}
引用文献:
- getRange(row, column, numRows, numColumns)
- Benchmark: Reading and Writing Spreadsheet using Google Apps Script
- Advanced Google services
- Method: spreadsheets.batchUpdate
- UpdateCellsRequest
如果我误解了您的问题并且这不是您想要的结果,我深表歉意。届时,您能提供一个电子表格样本吗?借此,我想确认一下您的情况。
关于javascript - 如何使用 .map() 方法将值从一页放置到另一页,并使用数据作为下一页的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998056/