Скрипт для автоматической вставки определенного текста в ячейки электронной таблицы Google на основе даты в другой ячейке в той же строке - PullRequest
0 голосов
/ 14 октября 2019

У меня есть следующий скрипт, предоставленный @ZektorH в другом моем вопросе .

function onEdit(e) {
  if (e.range.getColumn() ==2) {
    //User edited the date column
    if (typeof e.range.getValue() === typeof new Date()) {
      //Value of edit was a date
      endColumns(e.range.getRow(), e.range.getValue());
    } else if (e.range.getValue() === ""  || e.range.getValue() === null) {
      var sheets = SpreadsheetApp.getActiveSheet();
      var resetRange = sheets.getRange(e.range.getRow(), e.range.getColumn()+1, 1, sheets.getMaxColumns()-e.range.getColumn());
      resetRange.clear({contentsOnly: true}); //Will delete all text, not only the "ENDED" text.
    }
  }
}

function endColumns(rowNum, limitDate) {
  var sheets = SpreadsheetApp.getActiveSheet();

  var colOffset = 3; //Offset to account for your row Headers
  var dateHeader = sheets.getRange(1, colOffset, 1, sheets.getMaxColumns()-colOffset);

  var availableDates = dateHeader.getValues()[0];

  var foundCol = 0;
  for (var i=0; i<availableDates.length; i++) {
    if (availableDates[i]>=limitDate) {
      break;
    }
    foundCol++;
  }

  var rewriteCells = sheets.getRange(rowNum, foundCol+colOffset, 1, sheets.getMaxColumns()-(foundCol+colOffset-1));

  //Add your formatting and text below:
  rewriteCells.setValue("ENDED");

  //Clear all cells that are "white" (no header)
  for (var i=0; i<availableDates.length; i++) {
    if (availableDates[i]==="" || availableDates[i] ===null) {
      sheets.getRange(rowNum, colOffset+i).clear();
    }
  }
}

Скрипт работает правильно после некоторых небольших правок, но есть еще одна проблема. Когда вы очищаете значение в ячейке date (столбец B) в строке, сценарий очищает все значения во всех ячейках этой строки.

Это проблема для меня, потому что многиестроки содержат важные данные в ячейках до ENDED даты.

Вопрос

Что мне нужно изменить в этом сценарии, чтобы он очищал толькоячейки с текстом ENDED после очистки ячейки даты ?

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Я немного переработал ваш код, в основном добавив условие, чтобы проверить, равняется ли значение в каждой ячейке «ENDED», и удалив данные только в этом случае:

// Delete all "ENDED" values:
var resetRange = sheets.getRange(e.range.getRow(), e.range.getColumn() + 1, 1, sheets.getMaxColumns() - e.range.getColumn());
var resetValues = resetRange.getValues()[0];
for(var i = 0; i < resetValues.length; i++) {
  if(resetValues[i] == "ENDED") {
    var resetCell = sheets.getRange(e.range.getRow(), e.range.getColumn() + 1 + i);
    resetCell.clearContent();
  }
}

А также это, который удаляет соответствующие значения «ENDED», если вы редактируете на более позднюю дату:

// Clear past dates if new date is later:
var beforeDate = sheets.getRange(rowNum, colOffset, 1, foundCol);
var beforeValues = beforeDate.getValues()[0];
for(var i = 0; i < beforeValues.length; i++) {
  if(beforeValues[i] == "ENDED") {
    sheets.getRange(rowNum, colOffset + i).clearContent();
  }  
}

Итак, полный код будет выглядеть так:

function onEdit(e) {
  if (e.range.getColumn() == 2) {
    //User edited the date column
    if (typeof e.range.getValue() === typeof new Date()) {
      //Value of edit was a date
      endColumns(e.range.getRow(), e.range.getValue());
    } else if (e.range.getValue() === ""  || e.range.getValue() === null) {
      var sheets = SpreadsheetApp.getActiveSheet();
      // Delete all "ENDED" values:
      var resetRange = sheets.getRange(e.range.getRow(), e.range.getColumn() + 1, 1, sheets.getMaxColumns() - e.range.getColumn());
      var resetValues = resetRange.getValues()[0];
      for(var i = 0; i < resetValues.length; i++) {
        if(resetValues[i] == "ENDED") {
          var resetCell = sheets.getRange(e.range.getRow(), e.range.getColumn() + 1 + i);
          resetCell.clearContent();
        }
      }      
    }
  }
}

function endColumns(rowNum, limitDate) {
  var sheets = SpreadsheetApp.getActiveSheet();

  var colOffset = 3; //Offset to account for your row Headers
  var dateHeader = sheets.getRange(1, colOffset, 1, sheets.getMaxColumns() - colOffset);

  var availableDates = dateHeader.getValues()[0];

  var foundCol = 0;
  for (var i = 0; i < availableDates.length; i++) {
    if (availableDates[i] >= limitDate) {
      break;
    }
    foundCol++;
  }

  var rewriteCells = sheets.getRange(rowNum, foundCol + colOffset, 1, sheets.getMaxColumns() - (foundCol + colOffset - 1));

  //Add your formatting and text below:
  rewriteCells.setValue("ENDED");

  // Clear past dates if new date is later:
  var beforeDate = sheets.getRange(rowNum, colOffset, 1, foundCol);
  var beforeValues = beforeDate.getValues()[0];
  for(var i = 0; i < beforeValues.length; i++) {
    if(beforeValues[i] == "ENDED") {
      sheets.getRange(rowNum, colOffset + i).clearContent();
    }  
  }


  // Clear all cells that are "white" (no header)
  for (var i = 0; i < availableDates.length; i++) {
    if (availableDates[i] === "" || availableDates[i] === null) {
      sheets.getRange(rowNum, colOffset+i).clear();
    }
  }
}

Я надеюсь, что это поможетвам.

0 голосов
/ 14 октября 2019

Вы можете выполнить итерацию по двумерному массиву, чтобы найти ячейки со значением «ENDED». Если у вас много данных, может быть медленно, но это правильный подход.

Пример

enter image description here

function test() {

  var sheet = SpreadsheetApp.getActive().getSheetByName("Sheet1");
  var range = sheet.getDataRange();
  var values = range.getValues();

  //Iterate over rows
  for (var i=0; i < values.length; i++){

    //Adding +1 to handle the index 0
    var row = i+1;

    for (var j=0; j < values[i].length; j++){

      Logger.log("Cell value: " + values[i][j]);

      var column = j+1;
      if (values[i][j] == "ENDED"){
        //Clears the content of the range, leaving the formatting intact.
        sheet.getRange(row, column).clearContent();
      }
    }
  }
}

enter image description here

Вам следует ознакомиться с документацией Скрипт Служб Google , у вас есть много образцов , которые могут пригодиться вам в будущем.

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...