Как создать макрос, чтобы автоматически скрывать / показывать листы в зависимости от условия? - PullRequest
0 голосов
/ 09 ноября 2019

Я полностью потерян здесь!

Моя электронная таблица содержит один лист «Основная запись продукта» с таблицей, содержащей три столбца: Идентификатор продукта (числовой) |Описание продукта |Статус продукта.

Каждый продукт имеет свой собственный лист в электронной таблице. Название каждого листа зависит от статуса продукта:

- «Активный» продукт: название листа = название продукта -> Лист виден

-«Неактивный» продукт: имя листа = идентификатор продукта -> лист скрыт

Поэтому я пытаюсь написать макрос, который скрывает / показывает листы в зависимости от условия:

  1. Статус продукта (активный / неактивный)
  2. Название листа (если имя содержит текст или нет)

Мне не нужно писать оба условия;только самый простой код.

Есть идеи? Спасибо!

Ответы [ 4 ]

0 голосов
/ 14 ноября 2019

Спасибо всем!

Наконец-то я нашла помощь с коллегой, и она работает. Это код на случай, если кто-то найдет полезным:

function updateSheetFromIndex(index)
{
    var app = SpreadsheetApp;
    var ss = app.getActiveSpreadsheet();
    var activeSheet = ss.getSheetByName(sheetNameOfTheMenu);
    var cell = activeSheet.getRange(index, 5);
    var formula = cell.getFormula();
    var regExpr = /\#gid=([0-9]*)"/;
    var result = regExpr.exec(formula);
    var cellStatus = activeSheet.getRange(index, 4);

    Logger.log(index)
    if (result != null) {
       var gid = result[1];

       for each (var sheet in SpreadsheetApp.getActive().getSheets()) {
         if(sheet.getSheetId()==gid){
           if (cellStatus.getValue() == "Activo") {
             Logger.log("Activo---");
             sheet.showSheet();
           }

           if (cellStatus.getValue() == "Inactivo") {
             Logger.log("Inactivo---");
             sheet.hideSheet();
           }
           break;
         }
       }
    } else {
      Logger.log("+++ No pattern matches");
      Logger.log("Formula");
      Logger.log(formula);
    }

}
0 голосов
/ 09 ноября 2019

Вот пример для вашей цели: ProdMaster, заголовок строки 1 [ProdId, Desc, Status] и строки после этого являются данными, а Status будет неактивным и активным:

function HideSheets() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheetByName('ProdMaster');
  var lrow = sheet.getLastRow();
  var myValue = sheet.getRange("A2:C" + lrow).getValues();

  for (a=1; a<myValue.length+1; a++)
  {
    var target = myValue[a-1];
    var tsheet = spreadsheet.getSheetByName(target[0]);
    if(tsheet==null) spreadsheet.insertSheet(target[0]);
    if(target[2]=='Active') tsheet.showSheet();
    if(target[2]=='Inactive') tsheet.hideSheet();
  }
};
0 голосов
/ 11 ноября 2019

В качестве способа решения вашей проблемы вы могли бы сделать следующее, вместо использования «Активных» или «Неактивных» в качестве контролеров для проверки логического условия, в «Основной записи продукта» вы могли бы установить статус с помощью функций ИСТИНА и ЛОЖЬ , таким образом, вы можете отделить жестко закодированный текст от вашего кода и избежать неприятностей, когда кто-то неправильно набирает слова «Активный» или «Неактивный».

function HideSheets() {

  // Get the active sheet and range of rows you want 
  var spreadSheet = SpreadsheetApp.getActive();
  var mainSheet = spreadSheet.getSheetByName('Product Master Record');
  var rows = mainSheet.getRange("A2:C" + mainSheet.getLastRow()).getValues();

  // Iterate over all rows 
  for(row in rows){
    // Get the sheets from their names and check if not null
    var secondarySheet = spreadSheet.getSheetByName(rows[row][0]);
    if(secondarySheet){
       if(rows[row][2]) secondarySheet.showSheet(); // show the sheet if value is true
       if(!rows[row][2]) secondarySheet.hideSheet(); // hide sheet if value is false
    }
  }

};

Документы

Я вижу твое новое в этом чудесном мире. Я дам вам несколько документов, которые помогут вам на вашем пути обучения:

0 голосов
/ 09 ноября 2019

@ Tedinoz @ user11982798 Спасибо за быстрые ответы!

Это базовый код, который я пытаюсь изменить, добавив условие:

функция HideSheets () {

var spreadsheet = SpreadsheetApp.getActive ();

spreadsheet.setActiveSheet (spreadsheet.getSheetByName ('Guitar'), true);

spreadsheet.getActiveSheet (). HideSheet (). ;

spreadsheet.setActiveSheet (spreadsheet.getSheetByName ('Bass'), true);

spreadsheet.getActiveSheet (). HideSheet ();

};

Работает нормально, но имя листов фиксированное, и я хочу, чтобы оно было динамичным в зависимости от состояния продукта или если имя листа содержит цифры.

Дело в том, что до вчерашнего дня у меня не былоЯ представляю, что такое Javascript ... поэтому я не знаю, как написать код условия и включить его в этот скрипт.

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