Делаем onEdit () быстрее и эффективнее - PullRequest
0 голосов
/ 17 января 2020

После нескольких поисков я пришел с кодом, который просматривает основной лист и показывает или скрывает листы (с именами от A до N) в зависимости от того, какой флажок отмечен / не отмечен (основное требование) .

Однако, похоже, что это не так эффективно, и требуется несколько секунд, чтобы по-настоящему показать / скрыть листы после того, как поставили галочки / сняли галочки с их соответствующих флажков. Недавно я узнал, что onEdit() всегда запускается всякий раз, когда есть редактирование где-либо в электронной таблице.

Я хотел бы попросить совета, если возможно выполнить onEdit(), только когда редактирование выполняется только по заданным c диапазоны, в частности B6: B20 основного лист (который содержит мои флажки) . Аналогично, вместо того, чтобы проходить по всем флажкам и показывать / скрывать листы, основываясь на том, что отмечено / не отмечено, возможно ли для onEdit() обнаружить то, что было отмечено / снято галочкой среди флажков, и показать / скрыть соответствующий лист? Возможно, мы добавим несколько других листов в будущем, и это станет еще более неэффективным, если мы попытаемся масштабировать текущий код.

Вот код:

function onEdit(e) {

var sheet = e.source.getSheetByName("Main");
var ss = SpreadsheetApp.getActiveSpreadsheet();
var A = ss.getSheetByName("A");
var B = ss.getSheetByName("B");
var C = ss.getSheetByName("C");
var D = ss.getSheetByName("D");
var E = ss.getSheetByName("E");
var F = ss.getSheetByName("F");  
var G = ss.getSheetByName("G");
var H = ss.getSheetByName("H");
var I = ss.getSheetByName("I");
var J = ss.getSheetByName("J");
var K = ss.getSheetByName("K");
var L = ss.getSheetByName("L");
var M = ss.getSheetByName("M");
var N = ss.getSheetByName("N");  

if(sheet.getRange('B6').getValue() === true){A.showSheet();}else{A.hideSheet();}
if(sheet.getRange('B7').getValue() === true){B.showSheet();}else{B.hideSheet();}
if(sheet.getRange('B8').getValue() === true){C.showSheet();}else{C.hideSheet();}
if(sheet.getRange('B9').getValue() === true){D.showSheet();}else{D.hideSheet();}
if(sheet.getRange('B10').getValue() === true){E.showSheet();}else{E.hideSheet();}
if(sheet.getRange('B11').getValue() === true){F.showSheet();}else{F.hideSheet();}
if(sheet.getRange('B12').getValue() === true){G.showSheet();}else{G.hideSheet();}
if(sheet.getRange('B13').getValue() === true){H.showSheet();}else{H.hideSheet();}
if(sheet.getRange('B14').getValue() === true){I.showSheet();}else{I.hideSheet();}
if(sheet.getRange('B15').getValue() === true){J.showSheet();}else{J.hideSheet();}
if(sheet.getRange('B17').getValue() === true){K.showSheet();}else{K.hideSheet();}
if(sheet.getRange('B18').getValue() === true){L.showSheet();}else{L.hideSheet();}
if(sheet.getRange('B19').getValue() === true){M.showSheet();}else{M.hideSheet();}
if(sheet.getRange('B20').getValue() === true){N.showSheet();}else{N.hideSheet();}
}

Аналогично, вот предварительный просмотр нашего Основного листа . На основе изображения должны отображаться листы B, E, J и K, а остальные должны быть скрыты:

enter image description here

1 Ответ

2 голосов
/ 17 января 2020

onEdit будет срабатывать каждый раз, когда лист редактируется, однако вы можете ссылаться на объект события (e), чтобы определить, какая ячейка была изменена, и предпринимать действия только в том случае, если редактирование выполняется в ячейке, которая вас действительно волнует.

Я бы сделал это, создав карту ячеек на листах, поэтому вам не нужно связывать операторы if, а просто проверить, сопоставлена ​​ли ячейка, и принять меры, если она есть.

var actionable_cell_map = {'B6':'A',
                           'B7':'B',
                           ...
                           'B20':'N'
                          };
function onEdit(e){
    if(e.range.getSheet().getName() == "Main"){
       var edited_cell = e.range.getA1Notation();
       if(actionable_cell_map[edited_cell]){
         var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(actionable_cell_map[edited_cell]);
         if(e.range.getValue() === true){
            sheet.showSheet();
         }else{
            sheet.hideSheet();
         }
       }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...