【问题标题】:Google Sheets: Move Row to Other Sheet, Then Back Again, Based on Cell ValueGoogle表格:根据单元格值将行移动到其他表格,然后再次返回
【发布时间】:2019-01-04 18:15:33
【问题描述】:

请帮忙!我已经研究了好几个星期,但没有解决方案。

我们使用谷歌表单将数据合并到谷歌表格中。有 2 张表格 - 接受所有表单回复的“INCOMPLETE”和“COMPLETE”。

我能够根据条件“COMPLETE”将行从工作表名称“INCOMPLETE”移动到工作表名称“COMPLETE”。

我需要帮助: (1) 如果有人不小心检查了“COMPLETE”,我终生无法找到将其反转的脚本,因此,将其移回“INCOMPLETE”表并按时间戳排序。

(2) 如果可能,我还想要另一列显示每次对该特定行进行更新时的时间戳。

(3) 如果可能,当不完整的剩余时间超过 2 天(从原始时间戳开始)时,向订单人员发送提醒电子邮件。

这是我目前拥有的脚本:

function onChange() {
  // moves a row from a sheet to another when a magic value is entered in a column
  // adjust the following variables to fit your needs
  // see https://productforums.google.com/d/topic/docs/ehoCZjFPBao/discussion
  var sheetNameToWatch = "INCOMPLETE";
  var sheetNameToWatch2 = "COMPLETE";
  var columnNumberToWatch = 7; // column A = 1, B = 2, etc.
  var valueToWatch = "COMPLETE";
  var valueToWatch2 = "INCOMPLETE";
  var sheetNameToMoveTheRowTo = "COMPLETE";
  var sheetNameToMoveTheRowTo2 = "INCOMPLETE";
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveCell();
  
  if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).copyTo(targetRange);
    sheet.deleteRow(range.getRow());
    
    } else if (sheet.getName() === sheetNameToWatch2 && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo2);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).copyTo(targetRange);
    sheet.deleteRow(range.getRow());   
}
  }

【问题讨论】:

  • 你有这条线else if (sheet.getName() === sheetNameToWatch2 && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch),我相信它应该是这样else if (sheet.getName() == sheetNameToWatch2 && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch2)我添加了一个工作版本作为答案,我用一些假数据和添加的数据验证对其进行了测试。有时我发现将实际值集成到代码中更容易,因为它更容易为我捕获错误。

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


【解决方案1】:

在测试过程中,我发现了我在上面的评论中留下的错误。我还想尽快添加对其他工作表的返回,以便代码尽快返回不需要的工作表。

function onChange() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getActiveRange();
  Logger.log('Head: Sheet: %s Range: %s col: %s row: %s value: %s',sh.getName(),rg.getA1Notation(),rg.getColumn(),rg.getRow(),rg.getValue());
  if(sh.getName()=='INCOMPLETE' || sh.getName()=='COMPLETE'){

    if(sh.getName()=='INCOMPLETE' && rg.getColumn()==7 && rg.getValue()=='COMPLETE') {
      var tsh=ss.getSheetByName('COMPLETE');
      var trg=tsh.getRange(tsh.getLastRow() + 1, 1);
      sh.getRange(rg.getRow(), 1, 1, sh.getLastColumn()).copyTo(trg);
      sh.deleteRow(rg.getRow());
      Logger.log('Top: Sheet: %s Range: %s col: %s row: %s',sh.getName(),rg.getA1Notation(),rg.getColumn(),rg.getRow());
    } 

    if (sh.getName()=='COMPLETE' && rg.getColumn()==7 && rg.getValue()=='INCOMPLETE') {
      var tsh=ss.getSheetByName('INCOMPLETE');
      var trg=tsh.getRange(tsh.getLastRow() + 1, 1);
      sh.getRange(rg.getRow(), 1, 1, sh.getLastColumn()).copyTo(trg);
      sh.deleteRow(rg.getRow());   
      Logger.log('Bot: Sheet: %s Range: %s col: %s row: %s',sh.getName(),rg.getA1Notation(),rg.getColumn(),rg.getRow());
    }
  }else{
    return;//quick return for other sheets
  }  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多