首页 > 解决方案 > Google Apps 脚本 - onEdit 使用数组将数据从一张表复制到另一张表

问题描述

由于我的工作表名称不断变化,我想使用 onEdit 从一个工作表复制到另一个超过 10 个选项卡

我试图修改下面的脚本来做我需要的,但就是找不到我出错的地方。

因此,如果有人在 10 个选项卡中的任何一个的第 36 列中选中一个框,代码就会将该行复制到主表

  function CopyRange(e) {
  var range = e.range;
  var sheet = range.getSheet()[6, 16];
    if (sheet.getSheetName() == [6, 16] && range.columnStart == 36 && range.rowStart >= 2 && e.value 
    == "TRUE") {
  var [[]] = sheet.getRange(range.rowStart, 1, 1).getValues();
  e.source.getSheetByName("Master").appendRow([]);
    }
  }

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


解释/问题:

您的方法有几个问题:

  • var sheet = range.getSheet()[6, 16];不是对数组进行切片的有效方法。而是使用slice getSheets().slice(6,16)

  • sheet.getSheetName() == [6, 16]这条线也无效。您正在将名称 ( String) 与数组进行比较。相反,您想检查活动工作表的名称是否属于工作表名称列表。首先,您需要使用map获取所有工作表名称:

    const all_sheets = e.source.getSheets().slice(6,16).map(sh=>sh.getName());

    然后使用包含您可以检查活动工作表的名称是否属于all_sheets数组:

    all_sheets.includes(active_sh.getName())

  • var [[]] = sheet.getRange(range.rowStart, 1, 1).getValues();这条线也无效。您想要的是将数据存储到变量中。但首先您需要将其转换为一维数组,因为这是appendRow接受的参数类型。因此,您需要将其十:

    const data = active_sh.getRange(row,1,1,active_sh.getLastColumn()).getValues().flat();
    master_sh.appendRow(data);
    
  • 最后,您可能需要重命名CopyRangeonEdit以使其正常工作,除非您将可安装的onEdit触发器附加到CopyRange.

解决方案:

function onEdit(e) {
  const row = e.range.rowStart;
  const col = e.range.columnStart;
  const master_sh = e.source.getSheetByName("Master")
  const active_sh = e.source.getActiveSheet();
  const all_sheets = e.source.getSheets().slice(6,16).map(sh=>sh.getName());

  if(all_sheets.includes(active_sh.getName()) && col == 36 && row > 1 && e.value == 'TRUE'){
  const data = active_sh.getRange(row,1,1,active_sh.getLastColumn()).getValues().flat();
  master_sh.appendRow(data);
  }
}

推荐阅读