Как запустить функцию onEdit/onChange в скрипте Google Apps для данных, полученных динамически с помощью запроса

Итак, я извлекаю некоторые данные из Google Sheet, скажем, A, в лист B.

На листе B я извлекаю данные из листа A, используя формулу Query().

Что мне нужно, так это когда новая строка добавляется на лист B (вытягивается, когда новая строка добавляется на лист A), а затем запускается сценарий.

Скрипт выберет случайное значение из столбца H, которое является раскрывающимся списком.

Кстати, скрипт, который работает с нединамическими данными:

function onEdit(e){

    var range = e.range;
    var row = range.getRow();
    const agentColumnName = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(row,8);
    const dropdownValues = agentColumnName.getDataValidation().getCriteriaValues()[0];
    agentColumnName.setValue(dropdownValues[Math.floor(Math.random() * dropdownValues.length)]);
        
}

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

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

Скриншот для понимания:

Формула Query+Importrange в A2 листа B:

=Query(IMPORTRANGE("https://docs.google.com/spreadsheets/d/XXXXXXX/edit","Sheet1!A2:G"),"select *",0)

К сожалению, на текущем этапе изменение «QUERY» не может быть напрямую обнаружено триггерами OnEdit и OnChange. Итак, в этом случае необходимо проверить изменение диапазона, в котором используется «ЗАПРОС». Но, к сожалению, из вашего вопроса я не могу узнать ваш "ЗАПРОС", ситуацию с вашей таблицей и способ изменения ячеек диапазона в "ЗАПРОС". Итак, чтобы правильно понять ваш вопрос, можете ли вы предоставить дополнительную информацию?

Tanaike 24.05.2024 08:02

Кстати, логику этой ситуации можно увидеть и в этом отчете.

Tanaike 24.05.2024 08:02

@Tanaike спасибо .. Я добавил дополнительную информацию в вопрос

Salman Khan 24.05.2024 08:25

Спасибо за ответ. Из вашего обновленного вопроса я заметил, что ваш «ЗАПРОС» извлекает значения, используя «IMPORTRANGE». К сожалению, судя по «Снимку экрана для понимания:», я не могу понять вашу реальную ситуацию. Какие у вас два изображения электронных таблиц соответственно? Поэтому я пока не могу предложить четкого ответа. Я думаю, что это связано с моим плохим знанием английского языка. Я должен извиниться за мое плохое знание английского языка. Но, мой отчёт будет полезен для вашей ситуации.

Tanaike 24.05.2024 08:31

Этот образец вывода похож на то, что вы ищете?

Saddles 24.05.2024 12:02

@Saddles Да, это именно то, что я хочу

Salman Khan 24.05.2024 14:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
96
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вместо использования триггера, прослушивающего события в электронной таблице с формулой QUERY + IMPORTRANGE, установите триггер для прослушивания изменений в исходной электронной таблице.

Другой вариант — сохранить «состояние листа» и использовать триггер, управляемый по времени, для сравнения фактического состояния с предыдущим состоянием.

Поскольку встроенного «состояния листа» не существует, вам следует его определить. Если ваш лист содержит только формулу, один из простых способов — использовать номер последней строки. В большинстве случаев может потребоваться использовать что-то более сложное в зависимости от каждого варианта использования.

Ответ принят как подходящий

Пытаться:

Попробуйте этот скрипт с триггером onChange().

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var rg = ss.getRange(2, 8, ss.getLastRow() - 1);
  var vl = rg.getValues();
  var dv = rg.getDataValidation().getCriteriaValues()[0];
  vl.forEach((r, i) => {
    var c = rg.getCell(i + 1, 1);
    c.isBlank() ? c.setValue(dv[Math.floor(Math.random() * dv.length)]) : null;
  });
}

Результат:

Привет, подскажите, что мне сделать, чтобы это было на всех листах? Сейчас он работает только на первом листе (Лист1) электронной таблицы.

Salman Khan 27.05.2024 15:01

Другие вопросы по теме