首页 > 解决方案 > 如何在 Google 表格的 3 张表格之间有条件地移动行?

问题描述

我在工作表上有一个任务列表,我一直在尝试找到一种简单的方法,根据一列中的状态(例如空白、已完成、已付款)将带有任务的行移动到不同的工作表。例如,第 2 行的任务被标记为“完成”。然后我需要删除该行并将其移至标有“完成”的工作表。从那里,当任务被支付时,我需要从“完成”选项卡中删除该行到“付费”选项卡。

我找到了一些代码,允许我为 1 行执行一次此操作,但它不会重复它下面的行。这是我一直在使用的代码:

function ConditionalShimmy2(){
var ss = SpreadsheetApp.getActiveSpreadsheet();

 var sheet1 = ss.getSheetByName('not done');
 var sheet2 = ss.getSheetByName('done');
 var sheet3 = ss.getSheetByName('paid'); 

  var cell = sheet1.getRange("f2:f277").getCell(1, 1);
  var rowtoInsert = "2:277"; 

 if(cell.getValue() == "done") 
 {

   sheet2.insertRows(2); 
   var range2 = sheet2.getRange(2 ,1,1,sheet1.getLastColumn()); 
  sheet1.getRange(cell.getRow(),1, 1, sheet1.getLastColumn()).copyTo(range2); 
  sheet1.deleteRow(cell.getRow()); 
 }
}

谁能帮我完成这段代码并让我知道我哪里出错了?

标签: google-apps-scriptgoogle-sheets

解决方案


为了完成您的任务,您可以尝试以下适合您情况的建议解决方案。

片段

function ConditionalShimmy2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var main = ss.getSheetByName("THE_NAME_OF_THE_MAIN_SHEET");
  var sheet1 = ss.getSheetByName("not done");
  var sheet2 = ss.getSheetByName("done");
  var sheet3 = ss.getSheetByName("paid");
  var taskNames = main.getRange(row, column, numRows, numColumns).getValues();
  var taskStatus = main.getRange(row, column, numRows, numColumns).getValues();
  var rowsDeleted = 0;
  for (var i = 0; i < taskStatus.length; i++) {
    if (taskStatus[i][0] == "not done") {
      sheet1.appendRow([taskNames[i][0]]);
      main.deleteRow((i + 1) - rowsDeleted);
      rowsDeleted++;
    } else if (taskStatus[i][0] == "done") {
      sheet2.appendRow([taskNames[i][0]]);
      main.deleteRow((i + 1) - rowsDeleted);
      rowsDeleted++;
    } else if (taskStatus[i][0] == "paid") {
      sheet3.appendRow([taskNames[i][0]]);
      main.deleteRow((i + 1) - rowsDeleted);
      rowsDeleted++;
    }
  }
}

解释

上面的代码片段循环遍历所有任务及其相关状态,并基于status列,然后利用该方法将每一行附加到适当的工作表,然后利用该方法从工作表中appendRow()删除。maindeleteRow()

笔记

为了使上述代码片段适合您的情况,您必须自定义与和getRange关联的方法的参数。因此,, , ,参数表示在给定坐标处左上单元格和给定行数和列数的范围。taskNamestaskStatusrowcolumnnumRowsnumColumns

参考


推荐阅读