Показать и скрыть строки и столбцы на основе разных выпадающих - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь создать «форму приема» как часть листа Google, которая будет отображать или скрывать строки и столбцы на основе выбора в различных раскрывающихся списках:

  1. Скрыть / показать столбец на другом листе в зависимости от выбора в раскрывающемся списке.

    • Если в раскрывающемся списке «NamedRange1» выбрано «A», показать столбец 3 на другом листе;
    • Во всех других случаях (т.е. если поле пустое или «B»), скрыть столбец 3 на другом листе;
  2. Скрыть / показать строки на одном листе в зависимости от выбора в раскрывающемся списке.

    • Если в «NamedRange2» выбрано «Да», показывать строки 15-19
    • Во всех остальных случаях (т. Е. Когда пусто или «Нет»), скрывать строки 15-19
  3. То же, что и выше, но с другим раскрывающимся списком и строками.

    • Если в «NamedRange3» выбрано «Да», показать строки 26-40
    • В во всех остальных случаях (т. е. когда пусто или "Нет"), скрыть строки 26-40

Пока что я могу получить номер 1 для работы, но не 2 или 3 .. Кроме того, я не могу г и т.д., чтобы они запускались автоматически при редактировании формы ...

Я довольно новичок во всем этом, поэтому любая помощь будет принята с благодарностью :-)

Это мой код, так далеко:

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Start Here >>")
}  

function HideColumns() {
  var ss = SpreadsheetApp.getActive();
  var name = ss.getRangeByName("NamedRange1");
  var namevalue = name.getValue();

  if (namevalue == "A") {
    var sheet = ss.getSheetByName("Sheet 2");
    sheet.showColumns(3);
  }
  else if (namevalue != "A") {
    var sheet = ss.getSheetByName("Sheet 2");
    sheet.hideColumns(3);   
  }
}

function HideRows() {
  var ss = SpreadsheetApp.getActive();
  var name = ss.getRangeByName("NamedRange2");
  var namevalue = name.getValue();  

  if (namevalue == "Yes") {
    var sheet = ss.getSheetByName("Sheet1");
    sheet.showRows(15, 10);            
  }
  else if (namevalue != "Yes") {
    var sheet = ss.getSheetByName("Sheet1");
    sheet.hideRows(15, 10);     
  }
}

function HideRows() {
  var ss = SpreadsheetApp.getActive();
  var name = ss.getRangeByName("NamedRange3");
  var namevalue = name.getValue();  

  if (namevalue == "Yes") {
    var sheet = ss.getSheetByName("Sheet1");
    sheet.showRows(26, 15);             
  }
  else if (namevalue != "Yes") {
    var sheet = ss.getSheetByName("Sheet1");
    sheet.hideRows(26, 15);
  } 
} 

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Поток сценариев:

  • Создание class для создания объекта конфигурации для каждого набора взаимодействий
  • Вызов метода run класса для выполнения требуемого действия

Пример сценария:

Предполагая, что именованные диапазоны 1,2,3 находятся на A1, B1 и C1 на листе «Начать здесь >>»,

/**
 * @param {GoogleAppsScript.Events.SheetsOnEdit} e
 */
const onEdit = e => {
  const range = e.range;
  if (range.getSheet().getName() !== 'Start Here >>') return;//exit if edit is not in Start Here >> sheet

  class config {
    /**
     * @param {string} sheetToDo Sheet to act upon
     * @param {string} func function to run on sheet
     * @param {number} index Index of column/row to start desired action
     * @param {number} num Number of Rows/Columns to hide/show
     * @param {string} strToCheck The string to check against edited value
     * @param {any} val  edited value
     */
    constructor(sheetToDo, func, index, num, strToCheck, val) {
      this.sheetToDo = sheetToDo;
      this.func = func;
      this.index = index;
      this.num = num;
      this.switchFunc_(strToCheck === val);
    }
    run() {
      SpreadsheetApp.getActive()
        .getSheetByName(this.sheetToDo)
        [this.func](this.index, this.num);
    }
    switchFunc_(toggle) {//To switch hide to show and viceversa
      if (!toggle) {
        const change = ['hide', 'show'];
        this.func =
          change[Number(!change.indexOf(this.func.slice(0, 4)))] +
          this.func.slice(4);
      }
    }
  }
  const map = {
    A1: val => new config('Sheet2', 'hideColumns', 3, 1, 'A', val),//if edit is in A1, 
    B1: val => new config('Sheet1', 'showRows', 15, 4, 'Yes', val),
    C1: val => new config('Sheet1', 'showRows', 26, 15, 'Yes', val),
  };
  const createConfig = map[range.getA1Notation()];
  if (createConfig) createConfig(e.value).run();
};

Производительность :

  • ~ 1-2 с, если редактирование приводит к скрытию / отображению строк

Ссылки:

0 голосов
/ 09 апреля 2020

Вы можете написать это так:

Крупный потребитель все еще прячется и показывает строки и столбцы

function onEdit(e) {
  const n1=e.source.getRangeByName("NameRange1").getValue();
  const n2=e.source.getRangeByName("NamedRange2").getValue(); 
  const n3=e.source.getRangeByName("NamedRange3").getValue();
  const sh1=e.source.getSheetByName("Sheet1");
  const sh2=e.source.getSheetByName("Sheet2");
  if (n1=="A"){sh2.showColumns(3);}else{sh2.hideColumns(3);}
  if (n2=="Yes"){sh1.showRows(15,10);}else{sh1.hideRows(15,10);}
  if (n3=="Yes"){sh1.showRows(26,15);}else{sh1.hideRows(26,15);} 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...