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

У меня есть таблица Google типа планировщика, в которую ежедневно добавляются данные 8-10 пользователей. Когда я добавляю дату в ячейку, я хочу, чтобы все ячейки в одной строке после этой даты были отформатированы и добавили текстовое значение, например, «ENDED».

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

Есть ли способ сделать это с помощью скрипта ?. ... и если скрипт может обрабатывать также форматирование ячеек, это будет лучшим решением.

Вот мой пример файла, чтобы лучше понять, что я пытаюсь сделать ...

https://docs.google.com/spreadsheets/d/1QplyEcNu-svYwFq9wvPVEKnsEP1AnrlAkbBxNwEFPXg/edit#gid=2087617521

1 Ответ

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

Это можно сделать с помощью триггера и пользовательской функции.

Создайте новый проект сценария приложений и используйте этот код:

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

  //Add your formatting and text below:
  rewriteCells.setValue("Ended");
  rewriteCells.setBackground("red");
  rewriteCells.setFontColor("yellow");

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

Затем создайте триггер для запуска *Функция 1006 * при каждом редактировании.

В этом случае есть несколько жестко закодированных значений:

  • e.range.getColumn() == 2 для строки, в которую вы добавляете даты
  • var colOffset = 3 количество пропущенных столбцов перед чтением дат

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

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