Электронная таблица с условным раскрывающимся списком на основе параметров из другого листа - PullRequest
1 голос
/ 29 апреля 2020

У меня есть лист назначения, где в столбце «B» есть список «Компаний», в столбце «K» я бы выбрал с раскрывающимся списком доступный «Адрес» (указанного c). Компания ») взяты из другого листа, расположенного в столбцах B и J.

Как это сделать с помощью скрипта?

https://docs.google.com/spreadsheets/d/15g_3TMmVufKZogCbO3SUWBUp3iwc21nQgPBw6_GWXQQ/edit

1 Ответ

2 голосов
/ 30 апреля 2020

Я считаю, что ваша цель заключается в следующем.

  • Вы хотите поместить правила проверки данных в столбец "K2: K" на листе destination.
  • Вы хотите создать правила, извлекая значения из столбцов «B» и «J» на листе source.

Для этого, как насчет этого ответа?

Поток:

  1. Извлечение значений из обоих листов.
  2. Создание объекта для создания правил.
  3. Создание правил.
  4. Поместите правила в столбец «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 дополнительных вопроса в ответе я отвечаю следующим образом.

  • Q1: Если в будущем я хотел бы получить значения из других столбцов в источнике листа. Как редактировать скрипт?
    • A1: В этом случае, пожалуйста, измените [a,b,,,,,,,,j]. Теперь a, b и j равны Company, Address options 1 и Address options 2 соответственно.
  • Q2: Обновление листов с помощью скрипта Предлагаешь мне активировать триггер?
    • А2. Я не могу понять, что вы хотите сделать.
  • Q3: Если я поставлю значение в столбце «B» (пункт назначения), которого нет в столбце «A» ( источник), скрипт не работает. Мне нужно это.

    • A3: Пожалуйста, измените приведенный выше скрипт следующим образом.
    • С

      - const rules = dstValues.map(([e]) => ([SpreadsheetApp.newDataValidation().requireValueInList(obj[e]).build()]));
      
    • До

      const rules = dstValues.map(([e]) => ([obj[e] ? SpreadsheetApp.newDataValidation().requireValueInList(obj[e]).build() : null]));
      

Добавлено 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);
}
...