为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕勒3428872 2023-06-15 17:11:29
尝试使用执行此代码时出现以下错误。异常:数据中的列数与范围中的列数不匹配。数据为 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 的新手,欢迎任何提示。
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

我相信你的目标如下。


当“数据”表中的单元格 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

  }

}


查看完整回答
反对 回复 2023-06-15
  • 1 回答
  • 0 关注
  • 57 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信