Как получить автоматическое обновление sh настраиваемую функцию ячейки электронной таблицы Google из скрипта приложения Google [custom fuction refre sh] - PullRequest
1 голос
/ 09 июля 2020

как получить текущий список имен листов автоматически обновлять sh скриптом приложения Google при создании новых листов или изменении имени листа, дублировании листов или удалении листов из таблицы Google

:::::: Мне нужен список листов с именем ::::::::::::

  1. Есть много листов
  2. Новый лист будет добавлен другим пользователем
  3. Имя нового листа будет изменено другим пользователем
  4. некоторые листы будут удалены другим пользователем
  5. Мне нужен список имен существующих листов, не прошедший

:: :::::::::::::::::::::::::::::::::::::

и список имен листов должен отображаться на втором листе , что кодовое выражение - лист [1]

приведенный ниже код работает хорошо. но это не refre sh добавлением или удалением листов

function sheetnames()
{
 return SpreadsheetApp.getActiveSpreadsheet().getSheets().map(function(x) {return x.getName();});
}

1 Ответ

3 голосов
/ 09 июля 2020

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

  • Вы используете функцию sheetnames() в качестве настраиваемой функции в Google Spreadsheet.
  • Вы уже подтвердили, что ваша работает функция sheetnames().
  • Вы хотите обновить sh пользовательскую функцию, когда лист удаляется, вставляется, копируется и имя листа изменяется.

По порядку Для достижения вышеуказанного я хотел бы предложить следующий метод.

Использование:

1. Подготовьте сценарий.

В этом случае образец сценария для обновления настраиваемой функции sheetnames() в электронной таблице запускается триггером события OnChange. Для этого скопируйте и вставьте следующий образец сценария в привязанный к контейнеру сценарий электронной таблицы и сохраните сценарий.

function onChange(e) {
  var lock = LockService.getDocumentLock();
  if (lock.tryLock(10000)) {
    try {
      const prop = PropertiesService.getScriptProperties();
      if ((e.changeType === "OTHER" || e.changeType === "REMOVE_GRID" || e.changeType === "INSERT_GRID") && !prop.getProperty("run")) {
        const formula = "=sheetnames";  // <--- Please set the function name of the custom function.
        const ss = e.source;
        const tempFormula = "=sampleFormula";
        ss.createTextFinder("^\\" + formula).matchFormulaText(true).useRegularExpression(true).replaceAllWith(tempFormula);
        ss.createTextFinder("^\\" + tempFormula).matchFormulaText(true).useRegularExpression(true).replaceAllWith(formula);
        prop.setProperty("run", "done");
      } else {
        prop.deleteProperty("run");
      }
    } catch(e) {
      throw new Error(e);
    } finally {
      lock.releaseLock();
    }
  }
}
  • Чтобы избежать дублирования запуска сценария, LockService используется.
  • Чтобы избежать бесконечного l oop триггера, используется PropertiesService.

2. Установите триггер события OnChange.

Чтобы выполнить функцию onChange, установите триггер события OnChange в функцию onChange. Вы можете увидеть способ установки в этом официальном документе .

3. Тестирование

Чтобы протестировать вышеуказанный скрипт, после того, как вы установили функцию onChange в качестве устанавливаемого триггера события OnChange, например, вставьте новый лист. Этим вы можете подтвердить, что пользовательская функция sheetnames() обновлена.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...