如何在二维数组上运行 .map() 后用数据填充列

尝试使用执行此代码时出现以下错误。异常:数据中的列数与范围中的列数不匹配。数据为 0,但范围为 1。(第 15 行,文件“代码”)


function getName(){

  const srcSheetName = "result";

  const dstSheetName = "Allergy";

  const ss = SpreadsheetApp.getActiveSpreadsheet();

  const srcSheet = ss.getSheetByName(srcSheetName);

  const allergyRange = srcSheet.getRange('F1:BQ' + srcSheet.getLastRow()).getValues();

  const dstSheet = ss.getSheetByName(dstSheetName);

  const lr = dstSheet.getRange("A2:A").getLastRow();

  var names = allergyRange.map(row => row.slice(row.length-12)).forEach((row, i) => {

    if(!row.every(val => val == 0)) return allergyRange[i][0]

});

  const dstRange = dstSheet.getRange(2, 1, dstSheet.getLastRow(), 1);

  const dstValues = dstRange.getValues();

  const putValues = [names];

  dstRange.setValues(putValues);

}

我认为这是因为名称变量“名称”的列太多或所需范围没有值。我曾尝试将“名称”直接放入 setValues 函数中,但这不起作用,并且我收到另一条错误消息“Bad Value”。


更新:发生这种情况是因为 [names] 为空。


dstRange.setValues(names);

我认为潜在的问题是我使用 .map() 方法而不是 Object.assign() 来操作原始二维数组,但是当我在这里查看文献时它指出 .map() 创建了一个新数组和 JavaScript 视图数组作为对象。


为了诊断问题,我在循环内外都使用 Logger.log 来了解数据集发生了什么。


内循环:


var names = allergyRange.map(row => row.slice(row.length-12)).forEach((row, i) => {

    if(!row.every(val => val == 0)) Logger.log(allergyRange[i][0])

});

外循环:


  var names = allergyRange.map(row => row.slice(row.length-12)).forEach((row, i) => {

    if(!row.every(val => val == 0)) return allergyRange[i][0]

});

  Logger.log(names)

在循环内使用时,我得到所需的名称列表,但在循环外使用时,我在检查日志时得到“null”。


我必须缺少一个关键步骤。如何从“名称”中获取输出并使用 setValues() 或其他方法将每个输出放在 Google 表格中工作表的第一列中?有没有办法用循环的输出创建一个新的二维数组,或者我应该完全使用另一种方法来操纵数据集?我是 JavaScript 的新手,欢迎任何提示。


慕勒3428872
浏览 78回答 1
1回答

慕虎7371278

我相信你的目标如下。当“数据”表中的单元格 BF2:BQ 中有值时,您想从同一行的“F”列中检索值,并将值放入“过敏”表中。您希望使用 Google Apps 脚本实现此目的。在这种情况下,我想建议在“更新:”部分修改您的底部脚本。修改脚本:function newNames(){  var ss = SpreadsheetApp.getActiveSpreadsheet();  var data = ss.getSheetByName("result");  var cdata = ss.getSheetByName("result");  var valuesOfFormData = data.getRange("F2:BQ" + data.getLastRow()).getValues();  // Modified  var valuesForOrderChanges = valuesOfFormData.reduce((ar, [c,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ...d]) =>{    if (d.some(e => e.toString() != "")) ar.push([c]);  // Modified    return ar;  }, []);  if (valuesForOrderChanges.length > 0) {    cdata.getRange(2, 1, valuesForOrderChanges.length, valuesForOrderChanges[0].length).setValues(valuesForOrderChanges);  // Modified  }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript