Итак, я извлекаю некоторые данные из 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)
Кстати, логику этой ситуации можно увидеть и в этом отчете.
@Tanaike спасибо .. Я добавил дополнительную информацию в вопрос
Спасибо за ответ. Из вашего обновленного вопроса я заметил, что ваш «ЗАПРОС» извлекает значения, используя «IMPORTRANGE». К сожалению, судя по «Снимку экрана для понимания:», я не могу понять вашу реальную ситуацию. Какие у вас два изображения электронных таблиц соответственно? Поэтому я пока не могу предложить четкого ответа. Я думаю, что это связано с моим плохим знанием английского языка. Я должен извиниться за мое плохое знание английского языка. Но, мой отчёт будет полезен для вашей ситуации.
Этот образец вывода похож на то, что вы ищете?
@Saddles Да, это именно то, что я хочу





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