
Googleスプレッドシートで出勤表などを作るときは、まずはカレンダーの作成から始まることが多いと思います。
SEQENCE関数、TEXT関数、ArrayFormula関数などを使ってカレンダー作成に関する記事を書きました。
ドラッグ不要!Googleスプレッドシートで簡単なカレンダーの作り方
このようにして作成したカレンダーを出勤表として使用しています。
Googleスプレッドシートなので、皆でリアルタイムに入力、即共有できるのでとても気軽に使用でき便利です。
特にコロナ禍で出勤時間や勤務スタイルが多様化した現在では利便性を実感できます。
デジタルなカレンダーは、各端末では縦方向にスクロールするほうが操作性が良いため、日付は縦列に並べることが多いと思いますが、

todayで本日の日付の行にも色がつくようにして視認性上げ、土日祝に定番の色をつけ、週単位の状況の把握をしやすくする。
それでも日付が経過するにつれて、下にスクロールする動作が多くなってしまうのが難点。(GoogleSpreadsheetでは開くと先頭の行からの表示になってしまう。。。)
なので、一週間ごとに過去の日付の行を非表示にしていました。
月曜の朝に出勤したら、先週分までの行を非表示。
次の週。月曜の朝に出勤したら、先週分までの行を非表示。。。。
次の週。月曜の朝に出勤したら、先週分までの行を非表示。。。。。。。。。。
ふむぅ───。
まさか週にたった一度の超単純な操作でさえ、こんなに億劫に感じてくる自分がいるとは驚きました。
単純な操作ならスクリプトで自動化できそうな気がしてきました。(初心者のくせに)
思い立ってから検索に検索を重ねると、同じように行を非表示にしたい方が有り難くもスクリプトを公開してくださっていました。
@takaku_tさま
さらに↑を行の非表示スタイルに変える方法をヤフー知恵袋で質問回答がありました。
ヤフー知恵袋 質問者Kazuo Aiuraさま ベストアンサーよこやまさま
ありがたやありがたや。
しかし、所詮わたしのようなコピペ野郎には上手く動かず。。。
日付のフォーマット合わせて比較するらしいのですが。。。
また、一回上手く動いたはずなのに、2回目は動いていなかったり。。。
(一行ずつループで非表示にする方法は、行数が多いとタイムアウトになる???)
楽がしたかっただけなのに、こんなに苦労するなんて!!!
ハアハア。。。!!
落ち着いて!
背伸びしてもしょうがない!今、自分にできることは何か!!!?
わかっていることを整理すると。
最終的にhideRowsで非表示にしているということで、
複数行の非表示[hideRows(行インデックス, 行数)]
https://caymezon.com/gas-row-col-hide-show/
hideRows(rowIndex, numRows)
指定されたインデックスから始まる1つ以上の連続した行を非表示にします。
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);
}
あとはトリガー設定を毎週月曜の何時とかにしておけばよい。
スクリプトで完結できなかったのが残念ですが、
今の自分でわかる範囲でシンプルにでき、運用上問題ないので満足できました。
スクリプトで日付や時刻を扱うって難しいんですね。
勉強になりました。
ネット上の先輩方、大変参考になりました。
ありがとうございました。
当記事をご覧いただいた方で、なにかお気づきの点がございまいしたら、
ご指導ご鞭撻いただけますと幸いでございます。
最後までお読みいただきありがとうございました。
ピンバック: Googleスプレッドシートで先週までの行を自動的に非表示にする。~さらに毎月20日に先月分を表示する~やっぱりMATCH関数で先週の日曜日と先月20日の行数を取得する | 松栄シルク工場報 Sho