@dizzi

Как сделать проверку ячейки на изменения, когда данные приходят по IMPORTXML и IMPORTRANGE?

Добрый день.
Суть проблемы:
1. Есть таблица в которую приходят данные xml (IMPORTXML ) и IMPORTRANGE - пример это наличие с сайта (значения 1, 6, 11 и 0)
2. При изменении данных на сайте автоматически попадают данные по xml в таблицу
3. Я применил скрипт (укажу ниже) который должен показывать в какой ячейки пришло значение 0 и вывести в определённую ячейку дату и время когда это пришло.
4. Проблема в том что при ручном вводе данных - скрипт работает, но при изменении ячейки по методу xml - то-есть когда новые данные приходят из вне (меняется значение внутри ячейки автоматически) - скрипт не работает.
ЕСЛИ КТО-ТО ЗНАЕТ РЕШЕНИЕ ПОДСКАЖИТЕ - готов рассмотреть платное решение.

Скрипт:
function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  var idCol = e.range.getColumn();
  var idRow = e.range.getRow();
  if (idCol == 4 && sheet.getName() == 'list1') {
    var Value = e.range.getValues();
    if (Value == 0) {
      var vartoday = getDate();
      var varnow = getTime();
      sheet.getRange(idRow, 5).setValue(vartoday);
      sheet.getRange(idRow, 6).setValue(varnow);
    }
  }
}

// Returns YYYYMMDD-formatted date.
function getDate() {
  var today = new Date();
  today.setDate(today.getDate());
  //return Utilities.formatDate(today, 'PST', 'yyyy.MM.dd');
  return Utilities.formatDate(today, 'GMT+03:00', 'yyyy.MM.dd');
}

function getTime() {
  var today = new Date();
  today.setDate(today.getDate());
  //return Utilities.formatDate(today, 'PST', 'yyyy.MM.dd');
  return Utilities.formatDate(today, 'GMT+02:00', 'HH:mm');
}
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 1
oshliaer
@oshliaer
Google Products Expert
onEdit - это зарезервированная функция простого триггера события EDIT. Большинству это ничего не говорит, но в этом кроется вся "тайна".

Событие EDIT может вызвать только пользователь, только при редактировании значения ячейки непосредственно через браузер или через мобильное приложение. Т.о. ваш код работать не будет при обновлении данных через функции импорта.

Решением является создание еще одного триггера, который будет пересчитывать скрипт по времени.

Создайте новую функцию

function runOnEdit() {
  var source = SpreadsheetApp.openById('ABCD123456');
  var range = source.getRangeByName('Sheet!!B26');
  /**
   * @type {GoogleAppsScript.Events.SheetsOnEdit}
   */
  var e = {
    authMode: ScriptApp.AuthMode.LIMITED,
    oldValue: undefined, // ну или что хотите
    range: range,
    value: range.getValue(),
    source: source,
    triggerUid: 0,
    user: Session.getActiveUser(),
  };

  onEdit(e);
}


Добавьте `runOnEdit` к триггеру времени.

Связанные топики https://qna.habr.com/answer?answer_id=1533359#answ...

С уважением,
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Александр Иванов
Google Apps & API. Скрипты, Таблицы, Отчеты, Автом...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы