Javascript 如何使用.map()方法使用数据作为下一页的坐标,将值从一页放置到另一页
我试图获取X和Y值的数据范围,并将第三列的值放入另一个电子表格中,使用X和Y值作为单元格范围。如何使用Javascript 如何使用.map()方法使用数据作为下一页的坐标,将值从一页放置到另一页,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我试图获取X和Y值的数据范围,并将第三列的值放入另一个电子表格中,使用X和Y值作为单元格范围。如何使用.map()方法将数组用于一系列任务?我唯一的实际选择是使用“for循环”,它在处理多行数据时可能非常慢 我已经尝试并成功地使用了“for loop”函数,在一张纸上逐个查找每列中的值,并在另一张纸上绘制第三列值。但是,列表越大,处理过程越慢 function testMap() { //Open Active Spreadsheet App var ss = SpreadsheetA
.map()
方法将数组用于一系列任务?我唯一的实际选择是使用“for循环”,它在处理多行数据时可能非常慢
我已经尝试并成功地使用了“for loop”函数,在一张纸上逐个查找每列中的值,并在另一张纸上绘制第三列值。但是,列表越大,处理过程越慢
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”单元格值。它只是说
“无法将6,2,1转换为(类)。(第23行,文件“代码”)”
- 您希望使用从电子表格检索的坐标将值放入单元格
坐标表的“A”、“B”和“C”列分别为列号、行号和值
- 脚本的问题是使用
的getRange(行、列、numRows、numColumns)
行和
列作为数组。如下所示
- 行:整数
- 范围的起始行索引;行索引从1开始
- 列:整数
- 范围的起始列索引;列索引从1开始
- numRows:整数
- 要返回的行数
- numColumns:整数
- 要返回的列数
- 在您的例子中,似乎需要将值放入每个坐标的单元格中。这样,当数据量很大时,处理成本就会很高。
- 不幸的是,当使用电子表格服务的
时,会将值放在连续坐标中。这不能用于将值置于离散坐标的情况setValues
- 例如,如果您的目标可以使用单元格被包括空值在内的值覆盖的情况,则可以使用
setValues()
- 不幸的是,当使用电子表格服务的
y
和x
是数组,但是使用四个参数的getRange
方法要求每个参数都是数字,更具体地说,是整数。换句话说,您的代码为前两个参数Ref传递了错误的数据类型
值得注意的是,v
也是一个数组(1D数组),但setValues
需要一个2D数组
关于Array.prototype.map的使用
从广义上讲,你是在正确地使用它。参考,但不是为了你想要得到的结果
有几种方法可以实现这一结果
- 使用“蛮力”一次一个地设置每个坐标的单元值,可以使用
语句、for
或其他类似方法Array.prototype.forEach
- 使用“伪暴力”,使用类范围列表
- 通过创建2D数组一次设置所有值,并使用
setValues
'
,并且所有“行”的大小应相同。一种方法是首先使用'
作为默认值创建所需大小的2D数组,然后使用坐标将值放入相应的x、y坐标中(请记住数组索引是基于零的)。谢谢Tanaike!这是可行的,但脚本编写对我来说是非常新的,我的眼睛开始对你的编辑感到呆滞。“我需要一段时间才能理解你的大部分编辑内容。”迈克·洛伊斯感谢你的回复。我很高兴你的问题解决了。如果您对我的答案有任何疑问,请告诉我。我可以去哪里更好地理解或解释所使用的语言,如sheet id,如使用{}和使用批更新,以及应用非常有效的map()方法的一般方法?@Mike感谢您的回答。虽然我不确定这是否是一个更好的理解或解释,但我已经分别检查了map()
和batchUpdate at和documents的方法。@Mike和关于map()
和batchUpdate的更多示例脚本,我想检查这个Stackoverflow将帮助您理解。例如,这些是和。如果您有其他情况的问题,当您将其作为新问题发布时,用户可以想到解决方案。如果这些对你的情况没有帮助,我道歉。
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());
}