多くの非表示の行を含む Google スプレッドシートがあり、スプレッドシート内の行のリストを反復処理するときにそれらをスキップしたいと考えています。
行の半分以上が非表示になっており、チェックする必要がないため、主に効率の問題です。
どんな助けでも大歓迎です。
多くの非表示の行を含む Google スプレッドシートがあり、スプレッドシート内の行のリストを反復処理するときにそれらをスキップしたいと考えています。
行の半分以上が非表示になっており、チェックする必要がないため、主に効率の問題です。
どんな助けでも大歓迎です。
Apps Script でこれを行う直接的な方法はありませんが、行にスターを付けたい場合に、行の表示/非表示ステータスを取得する方法を提供する機能リクエストが公開されています。
を使用した回避策SUBTOTAL
。2 つの列 A と B を作成します。A には常に値が必要で、B には一連の数式があります。これらの 2 つの列は次のようになります。
A | B
---------------------------
1 | =NOT(SUBTOTAL(103, A1))
1 | =NOT(SUBTOTAL(103, A2))
1 | =NOT(SUBTOTAL(103, A3))
SUBTOTAL
指定された集計関数を使用して小計を返します。最初の引数 103 は、集計に使用される関数のタイプを定義します。2 番目の引数は、関数を適用する範囲です。
COUNTA
、範囲内の値の数を意味し、カウントしますセル範囲が 1 の場合の結果はSUBTOTAL
、セルが非表示の場合は 0 になり、セルが表示されている場合は 1 になります。NOT
それを反転します。
これで、スクリプトで列 B を読み取って、行が非表示になっているかどうかを知ることができます。
転置された質問と回答は次のとおりです。https://stackoverflow.com/a/27846180/1385429
イシュー トラッカーは、2010 年 8 月 3 日以降、そのリクエストを中優先度と「トリアージ済み」ステータスで保留しています。3 年以上、GAS チームからの解決の兆しはありません。
私の回避策は、行/列の可視性状態を示す特別な先頭文字を使用することでした。これは、上部ヘッダー行/列のセルの先頭のバッククォート (`) です。結合されたセルが列ヘッダーで使用されている場合は、Google エンジニアが API を改善するまで、空の行をその機能専用にする必要があります。1 行目/1 列目のセルに数式がある場合も同様です。これらの専用の行/列自体を非表示にすることができます。
この機能の使用を開始した後、列/行の表示/非表示の各コマンドは、カスタマイズされたメニューから実行する必要があります。そうしないと、バッククォートがない/過剰なために、プログラムで範囲を反復処理するときにエラーが発生します。
たとえば、選択したセルの行を非表示にするには、次の関数が呼び出されます
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 イベントを改善する時間を見つけたら、これらのバックティックを自動的に配置できるようになります。現在、changeType はEDIT、INSERT_ROW、INSERT_COLUMN、REMOVE_ROW、REMOVE_COLUMN、INSERT_GRID、REMOVE_GRID、OTHERに制限されており、行/列が挿入/削除された詳細はありません。GASの背後にいるチームは不足しているようです. プログラマーをもっと雇ってくれたらいいのに(クムクム)
回避策として、SUBTOTAL
セルの垂直範囲の小計を返すことができる関数を使用することで可能です。
構文は次のとおりです。
SUBTOTAL(function_code, range1, [range2, ...])
これらのコードの非表示の値は、(1 桁のコードの前に) 10 を追加することでスキップできます。
たとえばCOUNT
、非表示のセルをスキップしている間、およびそう110
している間は 102 ですVAR
。
関連:Googleスプレッドシートは、Webapps SEで表示された行のみを合計します