【问题标题】:Google Script to Move Multiple Rows Simultaneously to Another Sheet - Archive Rows and Delete Completed谷歌脚本将多行同时移动到另一个工作表 - 存档行和删除已完成
【发布时间】:2017-05-09 18:33:43
【问题描述】:

我正在尝试将多行同时从一个 Google 工作表移动到另一个工作表。

我想在一天结束时运行一次脚本以存档所有完整的作业。

只要目标单元格不为空,我编写的脚本一次只能移动 2 行。理想情况下,它将继续循环并仅移动标记为“完成”的作业。

我使用的表格是here

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Admin')
      .addItem('Archive', 'archive')
      .addToUi();
}

function archive() 
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Scheduled");
  var range = sheet.getRange('A5:Q200');
  var sheetToMoveTheRowTo = "Archive";
  var numRows = sheet.getLastRow();
  var row = sheet.getRange(5,1);

  for (var row = 5; row < numRows; row++) 
  {
    var status = sheet.getRange(row,1).getValue(); 

      if ( status == "Complete") {

    var targetSheet = ss.getSheetByName(sheetToMoveTheRowTo);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    sheet.getRange(range.getRow(),1,1, sheet.getLastColumn()).moveTo(targetRange);
    sheet.deleteRow(range.getRow());
  }
  }
}

【问题讨论】:

    标签: google-apps-script google-sheets move delete-row


    【解决方案1】:

    存档、Google 表格、移动、行、电子表格、删除

    您应该在一次操作中将所有数据设置为存档。您不能在一次操作中删除所有行,但您可以保存要删除的行,然后循环遍历行号。

    Link to Publicly Shared Spreadsheet with Code

    我将代码设置为如下结构:

    function archive() {
      var arrayOfRowsToArchive,data,i,lastColumn,L,numRows,range,rowsToDelete,
          ss,sheet,sheetToMoveTheRowTo,startRow,status,targetSheet,thisRowsData;
    
      //USER INPUT:
    
      startRow = 5;
    
      //END OF USER INPUT
    
      ss = SpreadsheetApp.getActiveSpreadsheet();
      sheet = ss.getSheetByName("Scheduled");
      sheetToMoveTheRowTo = "Archive";
      numRows = sheet.getLastRow();
      lastColumn = sheet.getLastColumn();
    
      arrayOfRowsToArchive = [];
      rowsToDelete = [];
    
      data = sheet.getRange(startRow, 1, numRows - startRow, lastColumn).getValues();//Get all values except the header rows
    
      L = data.length;
    
      for (i=0; i < L; i++) {
        status = data[i][0];
        //Logger.log('status: ' + status);
    
        if ( status === "Complete") {
          thisRowsData = data[i];//Only get inner array of data
          //Logger.log('thisRowsData: ' + thisRowsData)
          arrayOfRowsToArchive.push(thisRowsData);//Push one row of data to outer array
          rowsToDelete.push(i+startRow);//Get the row number to delete later
        }
      }
    
      targetSheet = ss.getSheetByName(sheetToMoveTheRowTo);
      targetSheet.getRange(targetSheet.getLastRow()+1, 1, arrayOfRowsToArchive.length, arrayOfRowsToArchive[0].length)
        .setValues(arrayOfRowsToArchive);
    
      //Logger.log('rowsToDelete: ' + rowsToDelete)
    
      for (i=rowsToDelete.length;i>0;i--) {//Delete from bottom up
        Logger.log((i-1).toString())
        Logger.log('rowsToDelete[i-1]: ' + rowsToDelete[i-1])
        sheet.deleteRow(rowsToDelete[i-1]);
      }
    }
    

    【讨论】:

    • 除了@Sandys 脚本之外,如果您选择,基于时间的触发器会将其设置为每天。 developers.google.com/apps-script/guides/triggers/installable
    • 我不确定您所说的“返回键”是什么意思。
    • 感谢您的帮助。很难找出如何使用返回键。仍然有问题 - 脚本现在一次删除两个标题行。删除标题行后,当 A5 中的状态为“完成”时,它会从顶部移动前两行。如果 A5 中的状态为空白或“进行中”并且标题行被删除,则会出现以下错误; TypeError:无法从未定义中读取属性“长度”
    • 需要在 cmets 中使用 shift 和 return 换行
    • 我搞定了。我复制了您的工作表,并运行了代码。我一次获取所有数据,而不是一次获取每一行。由于索引为零,我需要从删除部分的i 中减去 1。
    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多