Javascript 如何使用.map()方法使用数据作为下一页的坐标,将值从一页放置到另一页

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

我试图获取X和Y值的数据范围,并将第三列的值放入另一个电子表格中,使用X和Y值作为单元格范围。如何使用
.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()
解决方案: 为了解决上述问题,我建议使用batchUpdate of Sheets API的方法。使用Sheets API时,可以通过一次API调用将值放入离散坐标的单元格中。而且,对于输入值,当数据较大时,Sheets API比电子表格服务更快。基于这种情况,我建议使用Sheets API

修改脚本: 使用此脚本之前,请在启用工作表API

参考资料:
如果我误解了你的问题,而这不是你想要的结果,我道歉。届时,您能否提供一份电子表格样本?在此,我想确认您的情况。

关于错误
y
x
是数组,但是使用四个参数的
getRange
方法要求每个参数都是数字,更具体地说,是整数。换句话说,您的代码为前两个参数Ref传递了错误的数据类型

值得注意的是,
v
也是一个数组(1D数组),但
setValues
需要一个2D数组

关于Array.prototype.map的使用 从广义上讲,你是在正确地使用它。参考,但不是为了你想要得到的结果

有几种方法可以实现这一结果

  • 使用“蛮力”一次一个地设置每个坐标的单元值,可以使用
    for
    语句、
    Array.prototype.forEach
    或其他类似方法
  • 使用“伪暴力”,使用类范围列表
  • 通过创建2D数组一次设置所有值,并使用
    setValues

谢谢你,鲁本。我对你的评论还有一个问题。最后一点是怎么做的?@MikeLoesch使用JavaScript构建一个2D值数组。请记住,不应为空元素,因为空单元格使用空字符串
'
,并且所有“行”的大小应相同。一种方法是首先使用
'
作为默认值创建所需大小的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());
}