Делаем onEdit () быстрее и эффективнее

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

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

Я хотел бы получить совет, если возможно запустить onEdit() когда редактирование выполняется только в определенных диапазонах, в частности, B6: B20 основного листа (который содержит мои флажки) . Аналогично, вместо того, чтобы проходить по всем флажкам и показывать / скрывать листы, основываясь на том, что отмечено / не отмечено, возможно ли, чтобы onEdit() обнаружил то, что было 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, а остальные должны быть скрыты:

введите описание изображения здесь

Всего 1 ответ


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

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

var actionable_cell_map = {'B6':'A',
                           'B7':'B',
                           ...
                           'B20':'N'
                          };
function onEdit(e){
    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();
      }
    }
}

Есть идеи?

10000