Я считаю, что ваша цель заключается в следующем.
- Вы хотите поместить правила проверки данных в столбец "K2: K" на листе
destination
. - Вы хотите создать правила, извлекая значения из столбцов «B» и «J» на листе
source
.
Для этого, как насчет этого ответа?
Поток:
- Извлечение значений из обоих листов.
- Создание объекта для создания правил.
- Создание правил.
- Поместите правила в столбец «K» на листе
destination
.
Пример сценария:
function myFunction() {
// 1. Retrieve values from the both sheets.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const src = ss.getSheetByName("source");
const dst = ss.getSheetByName("destination");
const srcValues = src.getRange("A2:J" + src.getLastRow()).getValues();
const dstValues = dst.getRange("B2:B" + dst.getLastRow()).getValues();
// 2. Create an object for creating the rules.
const obj = srcValues.reduce((o, [a,b,,,,,,,,j]) => Object.assign(o, {[a]: [b, j]}), {});
// 3. Create the rules.
const rules = dstValues.map(([e]) => ([SpreadsheetApp.newDataValidation().requireValueInList(obj[e]).build()]));
// 4. Put the rules to the column "K" in the sheet `destination`.
dst.getRange("K2:K" + dst.getLastRow()).setDataValidations(rules);
}
Ссылки:
Добавлено 1:
На ваши 3 дополнительных вопроса в ответе я отвечаю следующим образом.
Добавлено 2:
Вопрос 2, я объясню. Естественно, когда я запускаю скрипт, выпадающий список заполняется, но если я добавляю новую компанию, я должен снова запустить скрипт и так далее ... чтобы избежать этого, как я могу это сделать?
Для выше вашего дополнительного 2-го вопроса, образец сценария выглядит следующим образом. В этом случае при редактировании столбца «B» листа destination
выполняется сценарий. В этом случае можно использовать простой триггер.
Пример сценария:
function onEdit(e) {
const range = e.range;
const sheet = range.getSheet();
if (range.getColumn() != 2 || sheet.getSheetName() != "destination") return;
// 1. Retrieve values from the both sheets.
const ss = e.source;
const src = ss.getSheetByName("source");
const dst = ss.getSheetByName("destination");
const srcValues = src.getRange("A2:J" + src.getLastRow()).getValues();
const dstValues = dst.getRange("B2:B" + dst.getLastRow()).getValues();
// 2. Create an object for creating the rules.
const obj = srcValues.reduce((o, [a,b,,,,,,,,j]) => Object.assign(o, {[a]: [b, j]}), {});
// 3. Create the rules.
const rules = dstValues.map(([e]) => ([obj[e] ? SpreadsheetApp.newDataValidation().requireValueInList(obj[e]).build() : null]));
// 4. Put the rules to the column "K" in the sheet `destination`.
dst.getRange("K2:K" + dst.getLastRow()).setDataValidations(rules);
}