Листы Google: переместите строку на другой лист, а затем снова на основе значения ячейки - PullRequest
0 голосов
/ 04 января 2019

Пожалуйста, помогите! Я исследовал это в течение нескольких недель без решения.

Мы используем формы Google для объединения данных в таблицы Google. Есть 2 листа: «НЕПОЛНО», который принимает все ответы формы, и «ЗАВЕРШЕНИЕ».

Мне удалось переместить строку на основе условия «ЗАВЕРШЕНО» из имени листа «НЕПОЛНЫЙ» в имя листа «ЗАВЕРШЕНО».

Мне нужна помощь с: (1) Я не могу на всю жизнь найти сценарий, который перевернет его, если кто-то случайно проверит «ЗАВЕРШЕНО», поэтому вернет его обратно на «НЕПОЛНЫЙ» лист и отсортирует его по метке времени.

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

1 Ответ

0 голосов
/ 04 января 2019

Во время тестирования я обнаружил ошибки, которые оставил в качестве комментария выше. Я также хотел бы как можно быстрее добавить возврат на другие листы, чтобы код возвращался на нежелательные листы как можно быстрее.

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
  }  
}
...