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

标签 javascript google-apps-script google-sheets

我试图获取 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”列分别是列号、行号和值。

如果我的理解是正确的,这个答案怎么样?

问题:

  • 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());
}

引用文献:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。届时,您能提供一个电子表格样本吗?借此,我想确认一下您的情况。

关于javascript - 如何使用 .map() 方法将值从一页放置到另一页,并使用数据作为下一页的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998056/

相关文章:

google-sheets - 如何使用公式从 Google 表格中的链接中提取 URL?

javascript - 谷歌表格中的周数似乎跳过了一周?

javascript - Ext js 4.2 销毁组件

javascript - Onchange 和表行选择的脚本冲突

javascript - 在 Angular 模板中使用 Angular 应用程序

javascript - 访问 Google 文档中的 Google Apps Scripts 脚本

javascript - 传递 URL 参数和 HTML 输出执行顺序

google-sheets - Google Sheets - 数据表中的序列日期?

javascript - google.maps.geometry.spherical 错误

javascript - 有没有一种简单的方法可以将自定义主题应用于 react-syntax-highlighter?