Скрыть листы на основе значения ячейки - PullRequest
0 голосов
/ 18 сентября 2018

Я довольно новичок в изучении скрипта приложения и просмотрел / попытался отредактировать этот скрипт, но я не получил желаемого результата.У меня есть лист под названием «Меню», в котором я хочу, чтобы пользователь мог выбрать один из трех вариантов раскрывающегося списка в ячейке A2 (например, синий, желтый, зеленый).Затем я хочу скрыть различные листы на основе выбора.Поэтому, если пользователь выбирает «Синий», я хочу, чтобы были видны только листы, начинающиеся со слова «Синий» + лист «Меню», а остальные должны быть скрыты.То же самое для желтого и зеленого.Как примечание есть 13 листов для каждого цвета.

Любая помощь с этим очень ценится.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Это альтернативная реализация @ JSmith's answer , использующая API REST для листов для более эффективного скрытия и отображения большого количества листов.

Для использованияREST API Sheets из Apps Script, сначала вам нужно включить его , поскольку это « расширенный сервис

Подход Sheets API позволяет вамработать с представлением данных в JavaScript, вместо того чтобы постоянно взаимодействовать со службой электронных таблиц (например, для проверки имени каждого листа).Кроме того, пакетный вызов API обрабатывается как одна операция, поэтому все изменения видимости отражаются одновременно , а методы showSheet() и hideSheet() службы электронных таблиц сбрасываются в браузер после каждого вызова.

var MENUSHEET = "Menu";
function onEdit(e) {
  if (!e) return; // No running this from the Script Editor.
  const edited = e.range,
        sheet = edited.getSheet();
  if (sheet.getName() === MENUSHEET && edited.getA1Notation() === "A2")
    hideUnselected_(e.source, e.value);
}

function hideUnselected_(wb, choice) {
  // Get all the sheets' gridids, titles, and hidden state:
  const initial = Sheets.Spreadsheets.get(wb.getId(), {
      fields: "sheets(properties(hidden,sheetId,title)),spreadsheetId"
  });
  // Prefixing the choice with `^` ensures "Red" will match "Reddish Balloons" but not "Sacred Texts"
  const pattern = new RegExp("^" + choice, "i");

  // Construct the batch request.
  const rqs = [];
  initial.sheets.forEach(function (s) {
    // s is a simple object, not an object of type `Sheet` with class methods
    // Create the basic request for this sheet, e.g. what to modify and which sheet we are referencing.
    var rq = { fields: "hidden", properties: {sheetId: s.properties.sheetId} };
    // The menu sheet and any sheet name that matches the pattern should be visible
    if (s.properties.title === MENUSHEET || pattern.test(s.properties.title))
      rq.properties.hidden = false;
    else
      rq.properties.hidden = true;
    // Only send the request if it would do something.
    if ((!!s.properties.hidden) !== (!!rq.properties.hidden))
      rqs.push( { updateSheetProperties: rq } );
  });
  if (rqs.length) {
    // Visibility changes will fail if they would hide the last visible sheet, even if a later request in the batch
    // would make one visible. Thus, sort the requests such that unhiding comes first.
    rqs.sort(function (a, b) { return a.updateSheetProperties.properties.hidden - b.updateSheetProperties.properties.hidden; });
    Sheets.Spreadsheets.batchUpdate({requests: rqs}, initial.spreadsheetId);
  }
}

При работе с различными API-интерфейсами REST от Google существует достаточно ресурсов:

Небольшое тестирование в книге с 54 листами, в которой я использовал API Sheets для применения некоторых изменений и @Код JSmith для отмены изменений показал, что подход API примерно в 15 раз быстрее, чем измеряется с помощью console.time & console.timeEnd.Изменения API заняли от 0,4 до 1,1 с (в среднем 1 с), в то время как метод обслуживания электронных таблиц занял от 15 до 42 с (в среднем 20 с).

0 голосов
/ 19 сентября 2018

попробуйте этот код:

function onEdit(e)
{
  //filter the range
  if (e.range.getA1Notation() == "A2")
  {
    // get value of cell (yellow||green||...)
    onlySheet(e.value)
  }
}

function onlySheet(str)
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  //get all sheets
  var sheets = ss.getSheets();
  for (var i = 0; i < sheets.length; i++)
  {
    //get the sheet name
    var name = sheets[i].getName();
    // check if the sheet is not the "Menu" sheet
    if (name != "Menu")
    {
      // check if the name of the sheet contains the value of the cell, here str
      //if it does then show sheet if it doesn't hide sheet
      if (name.match(new RegExp(str, "gi")))
        sheets[i].showSheet();
      else
        sheets[i].hideSheet();
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...