Существует ли функция скрипта Служб Google, которая указывает, что скрипт должен запускаться после заполнения определенного столбца? - PullRequest
1 голос
/ 25 октября 2019

Я создаю сценарий для автоматической сортировки строк, но я не хочу, чтобы строки перемещались, пока все ячейки в этой строке не будут заполнены

У меня есть следующий код:

SHEET_NAME = "New";
SORT_DATA_RANGE = "A2:M999";
SORT_ORDER = [
{column: 2, ascending: true},  // 3 = column number, sorting by 
descending order
{column: 1, ascending: true}, // 1 = column number, sort by ascending 
order 
];

function onEdit(e){
  multiSortColumns();
}
function multiSortColumns(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(SHEET_NAME);
  var range = sheet.getRange(SORT_DATA_RANGE);
  range.sort(SORT_ORDER);
  ss.toast('Sort complete.');
}

Однако, как только я заполняю столбец 2, строка сортируется, прежде чем я смогу заполнить столбцы 3-13.

Я ожидаю, что строки будут отсортированы после заполнения всех остальных столбцов.

1 Ответ

1 голос
/ 26 октября 2019

Вы хотите отсортировать столбцы с помощью триггера onEdit в ячейке B2, но только если ячейки в строке 2, столбцы с 3 по 13, уже заполнены.

Следующий ответ обращается к логике, необходимой для выполнениясортировать только при соблюдении определенных условий. Для этого есть пара ключевых элементов:

  • использование объектов событий - это облегчает жизнь.
  • получение данных для строки 2, столбцы 3 -13 (editedsheet.getRange(editedRow,3,1,11).getValues();), чтобы его можно было оценить в цикле.
  • IF # 1: проверить, была ли отредактированная ячейка B2 (if (editedRow == 2 && editedCol == 2){)
    • если да, то переберите диапазон значений (for (var i=0;i<rowdata[0].length;i++){)
    • , если нет, затем прервите.
  • IF # 2: внутрицикл: проверить, существует ли каждое значение (if (rowdata[0][i] > 0){)
    • , если все в порядке, затем следующий элемент в цикле
    • , если не в порядке, а затем прервать с помощью return;
  • если вы дошли до конца IF # 1, то выполните сортировку.

function onEdit(e) {
  //so5856469701

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // get edited variables
  var editedCell = e.range;
  var editedRow = editedCell.getRow();
  var editedCol = editedCell.getColumn();
  var editedsheet = ss.getSheetByName(e.source.getSheetName());
  // Logger.log("DEBUG: Cell = "+editedCell.getA1Notation()+", row = "+editedRow+", column = "+editedCol)

  //get the data from columns 3 to 13 for the edited row
  var rowdata = editedsheet.getRange(editedRow,3,1,11).getValues();

  //do stuff ONLY if the edited cell was B2
  if (editedRow == 2 && editedCol == 2){ 
    // Logger.log("DEBUG: edited cell was in the right row or column. Continue processing");

    //loop through the data range
    for (var i=0;i<rowdata[0].length;i++){   
      // Logger.log("DEBUG: value = "+rowdata[0][i]); 

      // assumes data is numeric, otheriwse test for .length>0
      // if the value in the dat range >0, then 
      if (rowdata[0][i] > 0){      
        // Logger.log("DEBUG: greater than zero");
      }else{
        Logger.log("DEBUG: value in column "+(+i+1)+" is NOT greater than zero; script abort");
        return;
      }
    }
    Logger.log("got through the if; now run the sort");
    // to get this far, all the cells in columns 3 to 13 have values so the sort can proceed
    // insert sort code

  }else{
    Logger.log("DEBUG: edited cell wasnt in the right row or column");
  }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...