Googleスプレッドシートで昨日までの行を自動的に非表示にする。~日付の比較判定に挫折~MATCH関数を組み合わせてなんとか実現できました。

endRowという表現は違うと知りました。。。

Googleスプレッドシートで出勤表などを作るときは、まずはカレンダーの作成から始まることが多いと思います。

SEQENCE関数、TEXT関数、ArrayFormula関数などを使ってカレンダー作成に関する記事を書きました。

ドラッグ不要!Googleスプレッドシートで簡単なカレンダーの作り方

このようにして作成したカレンダーを出勤表として使用しています。

Googleスプレッドシートなので、皆でリアルタイムに入力、即共有できるのでとても気軽に使用でき便利です。

特にコロナ禍で出勤時間や勤務スタイルが多様化した現在では利便性を実感できます。

デジタルなカレンダーは、各端末では縦方向にスクロールするほうが操作性が良いため、日付は縦列に並べることが多いと思いますが、

こんな感じで。良くも悪くも縦長レイアウト。。。

土日祝日に色が付けて、さらにtodayで本日の日付の行にも色がつくようにして視認性と週単位の把握をしやすくする。

それでも日付が経過するにつれて、下にスクロールする動作が多くなってしまうのが難点。

なので、一週間ごとに過去の日付の行を非表示にしていました。

月曜の朝に出勤したら、先週分までの行を非表示。

次の週。月曜の朝に出勤したら、先週分までの行を非表示。。。。

次の週。月曜の朝に出勤したら、先週分までの行を非表示。。。。。。。。。。

ふむぅ───。

まさか週にたった一度の超単純な操作でさえ、こんなに億劫に感じてくる自分がいるとは驚きました。

単純な操作ならスクリプトで自動化できそうな気がしてきました。(初心者のくせに)

思い立ってから検索に検索を重ねると、同じように行を非表示にしたい方が有り難くもスクリプトを公開してくださっていました。

Googleスプレッドシートで、昨日までの日付列を毎朝自動で非表示にするスクリプト

@takaku_tさま

さらに↑を行の非表示スタイルに変える方法をヤフー知恵袋で質問回答がありました。

グーグルスプレッドシートの過去の日付の行を、自動で非表示にしたいです。

ヤフー知恵袋 質問者Kazuo Aiuraさま ベストアンサーよこやまさま

ありがたやありがたや。

しかし、所詮わたしのようなコピペ野郎には上手く動かず。。。

日付のフォーマット合わせて比較するらしいのですが。。。

また、一回上手く動いたはずなのに、2回目は動いていなかったり。。。

(一行ずつループで非表示にする方法は、行数が多いとタイムアウトになる???)

楽がしたかっただけなのに、こんなに苦労するなんて!!!

ハアハア。。。!!

落ち着いて!

背伸びしてもしょうがない!今、自分にできることは何か!!!?

わかっていることを整理すると。

最終的にhideRowsで非表示にしているということで、

複数行の非表示[hideRows(行インデックス, 行数)]
hideRows(rowIndex, numRows)
指定されたインデックスから始まる1つ以上の連続した行を非表示にします。

https://caymezon.com/gas-row-col-hide-show/

hideRows( , )の括弧内に非表示にしたい始めの行のインデックス番号(行番号)と、そこから非表示にしたい行数を入れるとまとめて非表示にできる。

始めの行は決まっているので、問題は終わりの行の取得。

手っ取り早く行数を取得するのに関数を使うことにしました。

MATCH関数

指定した値と一致する範囲内のアイテムの相対的な位置を返します。

MATCH(検索キー, 範囲, 検索の種類)

検索キー – 検索する値です(42、”猫”、I24 など)。

範囲 – 検索対象の 1 次元配列です。

1 より大きい高さと幅の範囲を使用すると、MATCH 関数は #N/A! を返します。
検索の種類 – [省略可 – デフォルトは 1] – 検索の方法です。

1(デフォルト)を指定すると、MATCH 関数は範囲が昇順で並べ替えられていると想定し、検索キー以下の最も大きい値を返します。

0 は完全一致を示し、範囲が並べ替えられていない場合に必須の値です。

-1 を指定すると、MATCH 関数は範囲が降順で並べ替えられていると想定し、検索キー以上の最も小さい値を返します。

ということなので、B1のセルに

=MATCH(today()-1,A2:A,0)

と入力。

B1に(A2行から数えて)昨日の日付が入っている行までの行数が表示された。

スプレッドシートの関数だと単純にtoday()-1で昨日になり、「検索の種類」は完全一致の「0」としているが、フォーマットの調整なども必要なく比較することができるみたい。

目立たないように文字色を白にし、この関数が入ったセルを権限で「編集不可」としておいた。

無事に非表示にしたい行数が出せたので、あとは単純にgetRangeとgetValueでB1セルの値を取得し、hideRowsに入れるだけ。

function hideShukkinhyou() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(“出勤表”);
var startRow = 2;
var range = sheet.getRange(“B1”);
var endRow = range.getValue();
sheet.hideRows(startRow,endRow);
}

あとはトリガー設定を毎週月曜の何時とかにしておけばよい。

スクリプトで完結できなかったのが残念ですが、

今の自分でわかる範囲でシンプルにでき、運用上問題ないので満足できました。

スクリプトで日付や時刻を扱うって難しいんですね。

勉強になりました。

ネット上の先輩方、大変参考になりました。

ありがとうございました。

当記事をご覧いただいた方で、なにかお気づきの点がございまいしたら、

ご指導ご鞭撻いただけますと幸いでございます。

最後までお読みいただきありがとうございました。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中