Как пропустить скрытые строки при повторении через Google Spreadsheet с Google Apps Script

У меня есть электронная таблица Google со многими скрытыми строками в ней, и я хочу пропустить их при повторении списка строк в электронной таблице.

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

Любая помощь будет оценена.

Ответ 1

Нет прямого способа сделать это в приложениях Script, но есть запрос функции, чтобы обеспечить способ получения шоу/скрыть статус строки, если вы хотите отобразить ее.

Ответ 2

Отслеживание проблем содержит запрос с 3 августа 2010 г. со средним приоритетом и только статус "Триединый". Более 3 лет и никаких признаков решения команды GAS.

Моим обходным путем было использование специального ведущего символа, который указывал бы состояние видимости строки/столбца, это ведущая обратная сторона (`) в ячейках верхней строки заголовка/столбца. Если в заголовках столбцов используются объединенные ячейки, то пустая верхняя строка должна быть выделена только для этой функции, пока инженеры Google не улучшат API. То же самое относится, если в ячейке 1-й строки/столбца есть формулы. Эти выделенные строки/столбцы могут быть скрыты.

После того, как вы начнете использовать эту функциональность, каждая команда show/hide column/row должна выполняться из настраиваемого меню, иначе будут ошибки при итерации по диапазону программно из-за отсутствующего/чрезмерного обратного хода.

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

function hideSelectedRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = SpreadsheetApp.getActiveRange();

  // hide rows and add a ` backtick to the header cell
  for (var row = range.getRow(); row <= range.getLastRow(); row++)
  {
    // add backtick only if it isn't there (that may happen when manually unhiding the rows)
    var cellHeader      = sheet.getRange(row, 1)
    var cellHeaderValue = cellHeader.getValue()    
    if ( !cellHeaderValue.match(/^`/) ) {
      cellHeader.setValue('`' + cellHeaderValue)
    }

    // hide rows of selected range
    sheet.hideRows( row );
  }
}

и меню

SpreadsheetApp.getActiveSpreadsheet()
.addMenu("Show/Hide", [
    { name : "Hide Selected Rows",    functionName : "hideSelectedRows"    },
    { name : "Hide Selected Columns", functionName : "hideSelectedColumns" },
    null,
    { name : "Hide Rows",             functionName : "hideRows"            },
    { name : "Hide Columns",          functionName : "hideColumns"         },
    null,
    { name : "Show Rows",             functionName : "showRows"            },
    { name : "Show Columns",          functionName : "showColumns"         },
    null,
    { name : "Show All Rows",         functionName : "unHideAllRows"       },
    { name : "Show All Columns",      functionName : "unHideAllColumns"    }
  ])

После того, как инженеры Google найдут время для улучшения события onChange, можно будет автоматически поместить эти backticks. В настоящее время changeType ограничен EDIT, INSERT_ROW, INSERT_COLUMN, REMOVE_ROW, REMOVE_COLUMN, INSERT_GRID, REMOVE_GRID, OTHER без каких-либо подробностей о том, какой Row/Column был вставлен/удалены. Похоже, команда, стоящая за ГАЗом, скудная. Хотелось бы, чтобы они наняли больше программистов (khm khm)

Ответ 3

Обходной путь. Создайте 2 столбца A и B. Всегда должно иметь значение, а B имеет набор формул. Эти 2 столбца выглядят так:

A |           B
---------------------------
1 | =NOT(SUBTOTAL(103, A1))
1 | =NOT(SUBTOTAL(103, A2))
1 | =NOT(SUBTOTAL(103, A3))

SUBTOTAL возвращает промежуточное итоговое значение с использованием указанной функции агрегации. Первый аргумент 103 определяет тип функции, используемой для агрегации. Второй аргумент - это диапазон для применения функции.

  • 3 означает COUNTA и подсчитывает количество значений в диапазоне
  • +100 означает игнорировать скрытые ячейки в диапазоне.

Результат SUBTOTAL с диапазоном из 1 ячейки будет равен 0, когда ячейка будет скрыта, и 1, когда ячейка будет показана. NOT инвертирует его.

Теперь вы можете прочитать второй столбец со своим script, чтобы узнать, скрыта ли строка.

Здесь транспонированный вопрос и ответ: fooobar.com/questions/658946/...

Ответ 4

Что касается обходного пути, то можно использовать функцию SUBTOTAL, которая может возвращать промежуточный итог для вертикального диапазона ячеек.

Синтаксис:

SUBTOTAL(function_code, range1, [range2, ...])

где скрытые значения могут быть пропущены для любого из этих кодов путем добавления 10 (к одноразрядным кодам).

Например, 102 для COUNT при пропуске скрытых ячеек и 110 для VAR при этом.

Связанные: Таблицы Google суммируют только показанные строки в Webapps SE

Ответ 5

Новый API по состоянию на 2018 год, полезный для этой проблемы: isRowHiddenByUser. Смотрите также isRowFilteredByUser.