首页 > 解决方案 > Google Sheets onEdit 在具有不同列的工作表之间移动行

问题描述

我正在尝试创建一个简单的装运处理流程,并希望使用 onEdit 复选框触发器在两个工作表(选项卡)之间移动行。

这是我的项目的链接: https ://docs.google.com/spreadsheets/d/1SPO21kAyNX5fEqwkXVjmPASkfHvZ5Tzbq4s7e22VdYg/edit#gid=2005756436

基本概念是由多件组成的货物在第一张表上输入,然后复制到 WB_Log 表中。当计划将什么装载到卡车上时,一个复选框用于将工件从 WB_Log 表移动到 Load_Plan 表,它们的装载位置将在复选框右侧的列中确定。如果一件或多件货物不适合特定的卡车,我想取消选中 Load_Plan 上的框并将该行移回 WB_Log 表。

这是我发现几乎可以使用的 onEdit 函数:

function onEdit(event) {
 

   // assumes source data in sheet named WB_Log

  // target sheet of move to named Load_Plan

  // getColumn with check-boxes is currently set to column 14 or N

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var s = event.source.getActiveSheet();

  var r = event.source.getActiveRange();
  

  if(s.getName() == "WB_Log" && r.getColumn() == 14 && r.getValue() == true) {

    var row = r.getRow();

    var numColumns = s.getLastColumn();

    var targetSheet = ss.getSheetByName("Load_Plan");

    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);

    s.getRange(row, 1, 1, numColumns).moveTo(target);

    s.deleteRow(row);

  } else if(s.getName() == "Load_Plan" && r.getColumn() == 14 && r.getValue() == false) {

    var row = r.getRow();

    var numColumns = s.getLastColumn();

    var targetSheet = ss.getSheetByName("WB_Log");

    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);

    s.getRange(row, 1, 1, numColumns).moveTo(target);

    s.deleteRow(row);
  }
}

我的问题是 Load_Plan 在复选框右侧有我不想移回 WB_Log 的列。如何调整代码,以便在未选中复选框(False)时,仅 A:N 列中的信息从 Load_Plan 移回 WB_Log?

任何人都可以提供的任何建议或想法将不胜感激。

标签: google-apps-scriptgoogle-sheetstriggers

解决方案


修改点:

  • 当我看到您共享的电子表格时,“WB_Log”表在“N”列中有复选框。复选框被放在工作表的底部。这样,targetSheet.getLastRow() + 1返回工作表按钮的下一行。我认为这是您的问题的原因。
    • 我认为在您的情况下,当检索到“B4”后行的最后一行时,可以使用行号。
  • 并且,在您的脚本中,“Load_Plan”表中的“A”到“O”列由var numColumns = s.getLastColumn(). 但是“WB_Log”表具有“A”到“N”列。我认为检索到的列需要减少 1 列。

当以上几点反映到您的脚本时,它变成如下。

修改后的脚本:

请按如下方式修改您的脚本。

从:
} else if(s.getName() == "Load_Plan" && r.getColumn() == 14 && r.getValue() == false) {

  var row = r.getRow();

  var numColumns = s.getLastColumn();

  var targetSheet = ss.getSheetByName("WB_Log");

  var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);

  s.getRange(row, 1, 1, numColumns).moveTo(target);

  s.deleteRow(row);
}
至:
} else if(s.getName() == "Load_Plan" && r.getColumn() == 14 && r.getValue() == false) {
  var row = r.getRow();
  var numColumns = s.getLastColumn() - 1;  // Modified
  var targetSheet = ss.getSheetByName("WB_Log");
  var lastRow = targetSheet.getRange("B4").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();  // Added
  var target = targetSheet.getRange(lastRow + 1, 1);  // Modified
  s.getRange(row, 1, 1, numColumns).moveTo(target);
  s.deleteRow(row);
}

参考:


推荐阅读