Как добавлять и удалять границы в Google Apps Script

#google-apps-script #google-sheets

#google-apps-script #google-таблицы

Вопрос:

Цель:

  1. Добавьте границы в диапазон ячеек в зависимости от того, не является ли ячейка в столбце H следующей таблицы null. В таблице есть имена и общие номера билетов, которые будут появляться или исчезать автоматически в зависимости от определенных дат данных, которые я извлекаю с помощью функции ЗАПРОСА. И я хочу иметь возможность добавлять границы в диапазон ячеек, где имена отображаются в ячейках столбца H.

Например, допустим, впервые в ячейке H3 появляется имя с именем «John A». В этом случае я хочу иметь возможность добавлять границы в H3: I3. И если «John B» появляется под «John A», то я хочу добавить еще одну границу к H4: I4. И так далее.

введите описание изображения здесь

  1. Удаление границ зависит от того, были ли удалены значения в ячейках столбца H.

Например, если «John B» был автоматически удален для ячейки H4, то я хочу также удалить границы для H4: I4. И если «John A» также был удален из ячейки H3, то я хочу также удалить границы для H3: I3.

Текущий код: я пытаюсь передать параметры из функции onEdit(), которая находится в другом файле, в функцию insertDynamicBorders(), поскольку я думал, что это будет иметь значение для запуска события.

 function insertDynamicBorders(row) {
  var statusSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Status");

  // Columns
  dateColumn = 1;

  if (row > 16) {
    if (statusSheet.getRange("H3") != null ) {
      var cell = statusSheet.getRange("H3:I3");
      cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
    } else {
      var cell = statusSheet.getRange("H3:I3");
      cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
    }
    if (statusSheet.getRange("H4") != null) {
      var cell = statusSheet.getRange("H4:I4");
      cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
    } else {
      var cell = statusSheet.getRange("H4:I4");
      cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
    }
    if (statusSheet.getRange("H5") != null) {
      var cell = statusSheet.getRange("H5:I5");
      cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
    } else {
      var cell = statusSheet.getRange("H5:I5");
      cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
    }
    if (statusSheet.getRange("H6") != null) {
      var cell = statusSheet.getRange("H6:I6");
      cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
    } else {
      var cell = statusSheet.getRange("H6:I6");
      cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
    }
    if (statusSheet.getRange("H7") != null) {
      var cell = statusSheet.getRange("H7:I7");
      cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
    } else {
      var cell = statusSheet.getRange("H7:I7");
      cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
    }
  }
} 

Проблема:

  1. Граница не добавляется всякий раз, когда имя появляется в ячейке столбца H, однако границы добавляются, когда я вношу прямые изменения в источник данных, который я извлекаю из функции ЗАПРОСА.
  2. Когда границы добавляются, они добавляются в диапазоны ячеек, в которые включены имена, а также не включены в ячейки столбца H.

Комментарии:

1. «Выполнение скриптов и запросов API не приводит к запуску триггеров. Например, вызов Range.setValue() для редактирования ячейки не приводит к запуску триггера onEdit электронной таблицы » ссылка

2. Прочитайте документацию по простым триггерам. Они реагируют только на изменения пользователя.

3. Приношу свои искренние извинения и благодарю вас за отзывы. Я пройдусь по документу и попытаюсь подробнее разобраться в простых триггерах.

Ответ №1:

При использовании триггеров Apps Script onEdit , в частности, важно учитывать следующее:

onEdit(e) запускается, когда пользователь изменяет значение в электронной таблице.

Выполнение скриптов и запросов API не приводит к запуску триггеров. Например, вызов Range.setValue() для редактирования ячейки не приводит onEdit к запуску триггера электронной таблицы.

Принимая во внимание вышесказанное, то, что вы хотите, не может быть достигнуто напрямую.

Обходной путь

Что вы можете сделать в этой ситуации, так это использовать устанавливаемые триггеры и создать триггер, управляемый временем. Вы можете создать скрипт, который будет проверять наличие любых изменений, которые происходят в вашей электронной таблице по сравнению с предыдущей версией. Поскольку это должно быть сделано вами программно, это более громоздкий обход.

Другой вариант (по-прежнему использующий триггер, управляемый временем) — проверить, какая строка является последней в столбцах H и I (согласно вашему примеру), а также учитывая тот факт, что в эти столбцы вставляются только нужные значения.

Ссылка

Комментарии:

1. Приношу свои извинения за задержку здесь! Спасибо за объяснение и любезно предоставленный обходной путь!!