【问题标题】:How to send/archive a row of data from one sheet to another through trigger?如何通过触发器将一行数据从一个工作表发送/归档到另一个工作表?
【发布时间】:2021-03-22 00:42:54
【问题描述】:
function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var r = ss.getActiveRange();
  var rows = r.getRow();
  var cell = s.getRange(rows, r.getColumn());

  if (s.getName() == "Sheet" && r.getColumn() == 2 && cell.getValue() == "Archive" || cell.getValue() == "Cancel" || cell.getValue() == "Canceled" || cell.getValue() == "Cancelled") { // "Sheet" is original sheet, 2 is column to search for trigger
  var numColumns = s.getLastColumn();
  var targetSheet = ss.getSheetByName("Sheet Archive"); // "Sheet Archive" is the 2nd/target sheet
  var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
  s.getRange(rows, 1, 1, numColumns).moveTo(target);
  s.deleteRow(rows);
  Logger.log(target);
  }

我想要一种将一行数据从工作表(工作表)发送到另一个工作表(工作表存档)的方法。如果“存档”写在一行的第 2 列,它会将数据发送到存档表。

我希望数据逐行堆叠。假设我在工作表 #1 中存档第 20 行,我希望它将数据发送到第 9 行。如果我归档第 21、22 行,然后是 30、31 等,它应该将归档的行一个接一个地堆叠,所以在归档的第 9、10、11、12、13 等行中。

我曾经使用过的代码,但后来我重新设计了工作表,但它们停止了工作。当我键入存档时,它会从工作表 #1 中删除它,但随后在存档工作表中它会丢失。所以它正在“发送”它,但它没有正确显示或粘贴它。有没有更好的办法?

谢谢

【问题讨论】:

    标签: javascript google-apps-script google-sheets google-api


    【解决方案1】:

    我已经清理了你的代码,但看起来大部分都很好。不要使用getActiveRangegetActiveSheet,而是使用触发器参数提供的范围。这就是它的样子:

    function onEdit(e) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var r = e.range;
      var s = r.getSheet();
    
      var row = r.getRow();
      var col = r.getColumn();
      var cell = s.getRange(row, col);
      var archiveStates = ["Archive", "Cancel", "Canceled", "Cancelled"];
    
      if (s.getName() === "Sheet" && r.getColumn() === 2 && archiveStates.includes(cell.getValue())) {
        var numColumns = s.getLastColumn();
        var targetSheet = ss.getSheetByName("Sheet Archive"); // "Sheet Archive" is the 2nd/target sheet
        var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
        s.getRange(row, 1, 1, numColumns).moveTo(target);
        s.deleteRow(row);
      }
    }
    

    我还改变了您测试选项的方式并使用严格相等(注意这一点)。

    参考文献

    【讨论】:

    • 谢谢,这更干净了!仅供使用此功能的任何人参考,不要只是复制您正在处理的原始表格并将其指定为存档表格,因为格式可能会干扰数据传输。我意识到它正在将数据发送到存档表中的最后一行(第 3000 行),因为我认为它认为前 3000 行已“填写”并且它正在执行 +1 输入。我会从一张新的床单开始,然后从那里开始!
    【解决方案2】:

    传输数据以选择工作表并删除当前行

    function onEdit(e) {
      const sh = e.range.getSheet();
      const cvs = ['Archive', 'Cancel', 'Canceled', 'Cancelled'];//target sheets
      const idx = cvs.indexOf(e.value);//to get sheetname
      if (sh.getName() == 'Sheet' && e.range.columnStart == 2 && ~idx && e.range.rowStart>1) {
        const vs = sh.getRange(e.range.rowStart, 1, 1, sh.getLastColumn()).getValues();
        const tsh = e.source.getSheetByName(cvs[idx]);
        tsh.getRange(tsh.getLastRow() + 1, 1, vs.length, vs[0].length).setValues(vs);
        sh.deleteRow(e.range.rowStart);//delete current row
      }
    }
    

    表 1:

    Bitwise Not ~

    【讨论】:

    • 您好,感谢您的帮助。如果在第 2 列中写入“存档”或“取消”字样,我该如何做到这一点,它会将其发送到名为“工作表存档”的工作表?根据我在您发布的内容中的理解,它会将其发送到字面上称为“存档”“已取消”等的表格中,当这些触发词如果写在一行的第 2 列中时,它会将其发送到上述存档表中。谢谢!
    • 我已经做了我感兴趣的事,剩下的就看你了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多