如何将所有数据从源工作表复制到目标工作表?

时间:2021-01-04 00:07:09

标签: google-apps-script google-sheets

我制作了一个 Google 表格,用于在制造环境中跟踪批号。现在,当启用 onEdit 触发器时,源工作表中的数据只会将目标工作表中的第一行数据加倍。这是 Sheet 的链接。这是我到目前为止的代码:

    function onEdit(e) {
      if (e.range.getA1Notation() == 'N2') {
        if (/^\w+$/.test(e.value)) {        
          eval(e.value)();
          e.range.clear();
        }
      }
    }
    function Reset() {
      var s = SpreadsheetApp.getActiveSheet();
      if( s.getName() == "Input" ) {
      var dataRange = s.getRange('A5:V14');
    var values = dataRange.clearContent();
    s.getRange("C5:C14").setValue('-');
    s.getRange("F5:F14").setValue('-');
    s.getRange("I5:I14").setValue('-');
    s.getRange("L5:L14").setValue('-');
      }
    }
    function Submit() {
      const ss = SpreadsheetApp.getActive();
      const sh = ss.getSheetByName('Input');
      const targetSheet = ss.getSheetByName('Database');
      const data = sh.getRange(5,1,1,23).getValues(); // A5:W14
      targetSheet.getRange(targetSheet.getLastRow()+1,3,data.length,data[0].length).setValues(data);
    }

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您会担心当您选择“提交”时,会在数据库表中重复插入数据。 可以假设这是由于 Submit 函数运行了两次。第一次检查 /^\w+$/.test(e.value) 和第二次直接运行 eval(e.value)() 时。 我不确定这是错误还是功能:-)

试试这个代码,它有效:

function onEdit(e) {
  if (e.range.getA1Notation() == 'N2') {
    var val = e.value;
    switch(val) {
      case 'Reset': Reset();
        break;
      case 'Submit': Submit();
        break;
    }
    e.range.clear();
  }
}

更新。

双重插入是由于您使用了 2 个 onEdit() 触发器。查看当前项目的 Edith / Triggers。删除它。 enter image description here

Upd2.

如果您只想在数据库表上显示 10 行中的已填充行,请使用此代码。它根据 H 列中是否有某些文本来过滤行,例如 Adult 或 Pediatric。

function Submit() {
  var ss = SpreadsheetApp.getActive();
  var sh = ss.getSheetByName('Input');
  var targetSheet = ss.getSheetByName('Database');
  var data = sh.getRange(5,1,10,23).getValues();
  Logger.log(data);
  var fData = data.filter(data => (data[13] != ""));
  Logger.log(fData);
  targetSheet.getRange(targetSheet.getLastRow()+1,3,fData.length,fData[0].length).setValues(fData);
}