【问题标题】:Moving rows to another sheet based on a cell value script基于单元格值脚本将行移动到另一个工作表
【发布时间】:2019-04-17 02:38:40
【问题描述】:

希望使用脚本根据谷歌表格中的值移动单元格。对所有这一切都超级绿色,就在观看了一些有关基础知识的视频并使用网站上找到的代码之后,试图使其适用于我的电子表格。

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());
 }

}

它似乎根本不工作。这是电子表格的链接:https://docs.google.com/spreadsheets/d/1iRMuKKhC83lot4TV2dbOfBlgdtVzSuZ0rkoWKyTOUIM/edit?usp=sharing

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

【问题讨论】:

  • 在您的共享电子表格中,工作表名称“OLD”变为" OLD",顶部字母有一个空格。当脚本运行时,targetSheet 变为null 并在var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 处发生错误。所以请将“OLD”的工作表名称从" OLD"修改为OLD,然后再次运行。
  • 哇。这很有趣。
  • 已修复,工作表已从“OLD”更正为“OLD”
  • 还是不行。
  • 很抱歉我的评论对您的情况没有用处。可以提供Still not working.的详细信息吗?这样,它将帮助用户思考您的解决方案。

标签: google-apps-script


【解决方案1】:
  • 您想通过运行脚本将“H”列中“完成”的所有行移动到“旧”工作表中。
  • 您想通过自定义菜单运行脚本。

我可以像上面那样理解。如果我的理解是正确的,那么这个修改呢?我认为您的情况有几个答案。所以请认为这只是其中之一。修改后的脚本流程如下。

  1. 检索“当前”工作表上“H”列的值。
  2. 检索行索引以移至“旧”工作表。
  3. 移动值。
  4. 删除行。

修改脚本:

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)});
}

注意:

  • onOpen() 在您打开电子表格时运行。打开电子表格后,请从自定义菜单运行脚本。

参考资料:

【讨论】:

  • @Kevin Ahrens 欢迎。谢谢你让我知道。如果您的问题得到解决,请按接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果找不到按钮,请随时告诉我。 stackoverflow.com/help/accepted-answer
  • @Kevin Ahrens 感谢您的回复。
【解决方案2】:

试试这个:

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());
 }
}

【讨论】:

  • 谢谢,使用了其他答案,非常感谢您的回复,并感谢您纠正我的拼写错误!
猜你喜欢
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多