当前位置: 首页 > 知识库问答 >
问题:

Google Sheets onEdit在具有不同列的工作表之间移动行

倪振海
2023-03-14

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

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

基本概念是,由多个工件组成的装运将输入第一张表中,然后复制到WB\U日志表中。当计划将什么装载到卡车时,复选框用于将工件从WB\U日志表移动到load\U计划表,在该计划表中,其装载位置将在复选框右侧的一列中确定。如果一件或多件货物无法装入特定的卡车,我希望取消选中“装载计划”框,并将该行移回WB\U日志表。

这是我发现几乎可以工作的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\u Plan在复选框的右侧有列,我不想将这些列移回WB\u日志。如何调整代码,以便在复选框未选中(False)时,仅将A:N列中的信息从Load\u Plan移回WB\u Log?

如果有人能提供任何建议或想法,我们将不胜感激。

共有1个答案

严誉
2023-03-14
  • 当我看到您的共享电子表格时,“WB\U日志”表的“N”列中有复选框。复选框放在工作表的底部。通过此,targetSheet。getLastRow()1返回工作表按钮的下一行。我认为这就是你的问题所在。
    • 我认为在您的情况下,当检索到“B4”的后一行的最后一行时,可以使用行号

    当以上几点反映到脚本中时,它将变成如下所示。

    请修改您的脚本如下。

    } 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);
    }
    
    • getNextDataCell(方向)

 类似资料:
  • 我是一名编码等方面的初学者,但我正在努力理解我在做什么以及代码中发生了什么。 我想在不同的电子表格之间划一行。 我在“核心”电子表格中有一个脚本,它在“主页”和“完成”表格链接之间移动一行到电子表格: 我搜索了如何将位于“已完成”工作表上的数据移动到另一个名为“数据库”的电子表格链接到电子表格: 但我想将数据从表“CORE”/“Finished”传输到表“database”/“DB”,而不重写DB

  • 我有一些不同列的excel表格,如下所示: 表A:Col1 Col2 Col3 表B: Col2 Col4 Col5 表C: Col1 Col6 Col7 我的最终表格应该是: 最终表格:Col1 Col2 Col3 Col4 Col5 Col6 Col7 如果没有特定列的详细信息,则应保留为空。我一次只成功地合并了两个表,但我想将所有表合并在一起。 这是合并两张图纸的代码: 这是我编写的用于合并

  • 下图应该有助于尽可能清楚地说明这一点。 我有三个窗格A、B和C。B和C是A的子窗格,B有自己的子窗格(白色框)。通过拖放,我可以将B的孩子移动到B中的任何位置,并能够再次拾取他们,但如果拖到C,甚至是A的一小部分,他们可以被丢弃,但不能再次拾取。 我使用基本控制。要拖动,我使用imgView.setOnMouseDragged。 那么,我如何才能从一个窗格A拖动到窗格B或C,并且仍然允许拾取和拖动

  • 我用的是最新版本的MySQL Workbench 5.2.40。 在 EER 图中,有没有办法在表之间复制/粘贴列,以及使用拖放将列从一个表移动到另一个表? 我现在看不到任何这样的功能。如果是这种情况,考虑到稍后修改或更正设计会很繁琐,使用Workbench进行初步设计将很困难。我不妨直接使用PhpMyAdmin进行物理设计,因为我可以在更改表时复制SQL语句的粘贴部分。 有什么变通的修改工作台中

  • 我有三个工作表,我想根据特定条件在它们之间传输数据行。根据文本字符串从sheet1到sheet2,以及根据今天的日期与输入日期之间的差异从sheet2到sheet3。然而,到目前为止,我的尝试都是徒劳的。 我想根据列“P”读取为“Completed”还是“抛出”,将数据从sheet1移动到sheet2。我还想在“O”列中记录更改为上述任一选项的日期。 对于第二种情况,我想根据列“O”中列出的日期是