Google apps script 基于单元格值脚本将行移动到另一个工作表

Google apps script 基于单元格值脚本将行移动到另一个工作表,google-apps-script,Google Apps Script,希望使用脚本根据google工作表中的值移动单元格。在观看了一些关于基础知识的视频后,使用在网站上找到的代码,试图让我的电子表格工作起来,这一切都变得超级环保 function doneCopy() { var app = SpreadsheetApp; var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheetNameToWatch = ss.getSheetByName("Current") var columnNumberT

希望使用脚本根据google工作表中的值移动单元格。在观看了一些关于基础知识的视频后,使用在网站上找到的代码,试图让我的电子表格工作起来,这一切都变得超级环保

function doneCopy() {

 var app = SpreadsheetApp;
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheetNameToWatch = ss.getSheetByName("Current")
 var columnNumberToWatch = 8;
 var valueToWatch = "DONE" ;
 var sheetNameToMoveTheRowTo = "OLD";

 //var ss = SpreadsheetApp.getActiveSpreadsheet();//this has already been declared
 var sheet = SpreadsheetApp.getActiveSheet();
 var range = sheet.getActiveCell();

 if (sheet.getName() == "Current" && range.getColumn() == 8 && range.getValue() == "DONE") {
   var targetSheet = ss.getSheetByName("OLD");
   var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);

   sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
   sheet.deleteRow(range.getRow());
 }

}
它似乎根本不起作用。以下是电子表格的链接:

最终目标:“状态”列为“完成”时,整行移动到“旧”工作表(在底部添加一行)&然后从“当前”工作表中删除

SpreadsheetApp.getUi().createMenu('New Menu') {
  .addItem('Run', 'doneCopy')
  .addToUi()
}

function doneCopy() {
 var ss=SpreadsheetApp.getActive();
 var sheet=SpreadsheetApp.getActiveSheet();
 var range=sheet.getActiveCell();
 if (sheet.getName()=="Current" && range.getColumn()==8 && range.getValue()=="DONE") {
   var targetSheet=ss.getSheetByName("OLD");
   var targetRange=targetSheet.getRange(targetSheet.getLastRow() + 1, 1);//column one
   sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
   sheet.deleteRow(range.getRow());
 }
}
  • 您希望通过运行脚本将列“H”中所有“完成”的行移动到“旧”工作表中
  • 您希望通过自定义菜单运行脚本
我可以像上面那样理解。如果我的理解是正确的,这次修改怎么样?我认为对你的情况有几个答案。所以,请把这看作是其中之一。此修改脚本的流程如下所示

  • 检索“当前”工作表上“H”列的值
  • 检索用于移动到“旧”工作表的行索引
  • 移动值
  • 删除行
  • 修改脚本: 注:
    • 打开电子表格时会运行
      onOpen()
      。打开电子表格后,请从自定义菜单运行脚本
    参考资料:

    在共享电子表格中,工作表名称“OLD”变为
    “OLD”
    ,在顶部字母处留有空格。当脚本运行时,
    targetSheet
    变为
    null
    ,错误发生在
    var targetRange=targetSheet.getRange(targetSheet.getLastRow()+1,1)。因此,请将“OLD”的工作表名称从
    “OLD”
    修改为
    OLD
    ,然后再次运行。哇。这很有趣。已修复,工作表从“OLD”改为“OLD”仍然不起作用。很抱歉,我的评论对您的情况没有帮助。您能否提供有关
    仍不工作的详细信息。
    ?通过这种方式,它将帮助用户思考您的解决方案。@Kevin Ahrens欢迎您。谢谢你让我知道。如果您的问题已解决,请按“接受”按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果你找不到按钮,尽管告诉我@Kevin Ahrens感谢您的回复。谢谢,使用了另一个答案,非常感谢您的回复,感谢您纠正我的错误!
    function onOpen() {
      var ui = SpreadsheetApp.getUi();
      ui.createMenu('Custom Menu')
          .addItem('doneCopy', 'doneCopy')
          .addToUi();
    }
    
    function doneCopy() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName("Current");
      var values = sheet.getRange(1, 8, sheet.getLastRow(), 1).getValues();
      var moveRows = values.reduce(function(ar, e, i) {
        if (e[0] == "DONE") ar.push(i + 1);
        return ar;
      }, []);
      var targetSheet = ss.getSheetByName("OLD");
      moveRows.forEach(function(e) {
        sheet.getRange(e, 1, 1, sheet.getLastColumn()).moveTo(targetSheet.getRange(targetSheet.getLastRow() + 1, 1));
      });
      moveRows.reverse().forEach(function(e) {sheet.deleteRow(e)});
    }