2015-04-15 4 views
5

Я пытаюсь скрыть строки, если столбец A пуст. Я хочу применить это к конкретным листам (неделя1, неделя2, неделя3, неделя4 и неделя5). Это код, который у меня есть до недели1.Скрыть строки в электронной таблице google, если столбец A пуст?

function ConditionalHideRow() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Week1"); 
    var condition = sheet.getRange("A:A").getValue(); 
    if (condition = "EMPTY") { 
    sheet.hideRows(1,125) 
    }  

EDIT: Бонус вопрос, есть ли способ я могу получить его, чтобы отобразить когда Столбец A заполнен? Я использую форму формулы = query для заполнения моей электронной таблицы, и ее длина должна измениться по мере добавления большего количества данных.

+0

Если ответ ниже работал для вас, вы можете подумать о том, чтобы отметить его, чтобы все остальные знали. – ScampMichael

+0

Ваш бонусный вопрос заставляет меня думать, что все строки, которые вы скрываете, находятся ниже последней занятой строки. это верно? вы скрываете строки, которые перемежаются внутри данных или только в самом конце после последнего из данных? – ScampMichael

+0

Я скрываю строки, которые перемежаются внутри данных. Мой работодатель хотел, чтобы я создал электронную таблицу, где он мог видеть как доход, так и расходы по неделям, но у меня нет способа угадать, как долго может быть раздел «Доход», поэтому я добавил дополнительные пустые строки для компенсации.Используя формулу JPV, я смог скрыть пустые строки, но это становится больно, когда я не могу отобразить те же самые строки (с той же эффективностью), когда что-то добавлено к ним (я использую запрос importrange => для генерации данные). – Darksun

ответ

4

Я предполагаю, что «EMPTY» - это не строка, которая должна быть найдена в col A, и вы хотите проверить, действительно ли col A действительно пуст? Если это так, попробуйте:

function hideRows() { 
["Week1", "Week2", "Week3", "Week4", "Week5"].forEach(function (s) { 
    var sheet = SpreadsheetApp.getActive() 
     .getSheetByName(s) 
    sheet.getRange('A:A') 
     .getValues() 
     .forEach(function (r, i) { 
      if (!r[0]) sheet.hideRows(i + 1) 
     }); 
    }); 
} 

Или, для более «классического» подхода:

function hideRows2() { 
var sheets = ["Week1", "Week2", "Week3", "Week4", "Week5"]; 
for (var i = 0, sLen = sheets.length; i < sLen; i++) { 
    var sheet = SpreadsheetApp.getActive() 
     .getSheetByName(sheets[i]) 
    var val = sheet.getRange('A:A') 
     .getValues(); 
    for (var j = 0, vLen = val.length; j < vLen; j++) { 
     if (!val[j][0]) sheet.hideRows(j + 1) 
     } 
    } 
} 

Убедитесь, что вы не слишком много пустых строк (после последней строки с данными), как что может привести к таймауту выполнения сценария.

+0

Это сработало, спасибо! – Darksun

+0

классический подход больше похож на то, что я бы написал, но я, конечно, кое-что узнал из первого подхода. спасибо JPV – ScampMichael

+0

@ Darksun, рад слышать. Пожалуйста, подумайте о «принятии» ответа ... – JPV

0

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

Добавьте строку ниже, где он говорит, что // Добавить

function hideRows() { 
["Week1", "Week2", "Week3", "Week4", "Week5"].forEach(function (s) { 
    var sheet = SpreadsheetApp.getActive() 
     .getSheetByName(s) 
    sheet.unhide(sheet.getRange('A:A')) // Add this 
    sheet.getRange('A:A') 
     .getValues() 
     .forEach(function (r, i) { 
      if (!r[0]) sheet.hideRows(i + 1) 
     }); 
    }); 
} 

Или отобразите все независимо друг от друга:

function unhideRows() { 
["Week1", "Week2", "Week3", "Week4", "Week5"].forEach(function (s) { 
    var sheet = SpreadsheetApp.getActive() 
     .getSheetByName(s) 
    sheet.unhide(sheet.getRange('A:A')) 
    }); 
} 

На будущее, есть более эффективные способы ведения дел, когда вы можете обрабатывать непрерывные строки как блок вместо одного. Несмотря на то, что это работает, я считаю, что JPV, возможно, сделал это немного по-другому, если бы он понял макет.

+0

это действительно правильно. Я не мог «догадаться» о макете из первоначального вопроса (поэтому всегда полезно поделиться примерной таблицей). Во всяком случае, хорошо, что ты был рядом. :-) – JPV

+0

Это как доставка пиццы. Один или два раза в неделю, заказывая их индивидуально, прекрасно. Имея вечеринку и нуждающуюся в 12, вы не заказывали их по одному, вы делали бы один звонок и приказывали 12 для одной доставки. – ScampMichael

5

Вам не нужна формула для этого, вы можете использовать фильтр ...

  1. Выделите столбец в вопросе
  2. Выбрать * Данные>Фильтр
  3. Теперь в строке заголовка должна быть кнопка выпадающего списка. Нажмите на нее и выберите/деинсталлировать выберите условия

UPDATE: Это также должно работать на ваш бонусный вопрос, как хорошо. После заполнения столбца он больше не будет соответствовать условиям фильтра, если флажок «(Бланки)» не установлен.

Смежные вопросы