見出し画像

スプレッドシートでチェックが付いていて、ステータスが入った行を削除するGAS|備忘録

GASをかじってみようと思い、仕事で使えそうなツールを作ってみたので、忘れないように残しておきます。

超がつくほどの初心者の備忘録なので、正しい表現はできていないかもしれませんが、スプシの関数までなら使える人であれば、むしろ分かりやすくなっているかも…?

ただ、間違いだらけかもしれませんので、心優しい有識者の方がいらっしゃれば、ぜひコメント欄で補足してください。
僕が喜びます。



どんなツールを作りたいか

こんな見た目のツール
  • 完了したものは、チェックボックスにチェックする

  • タスク完了したら、「周知済」か「周知不要」かを記載する

  • 対応事項が完了し、周知のステータスを入れたものを、次の日の朝に削除したい

  • どちらかだけを実施している場合は、対応漏れの可能性があるので、削除してほしくない



基礎的な準備 ※GAS立ち上げ→操作するシートを指定するまで

スプレッドシートを作成する。

今回GASを作ってみて分かったのは、スプシのレイアウトを完成させてからGASをいじった方が良いということ。
レイアウトが完成していないと、後々GASのスクリプトを何度も確認・変更する必要があって、やる気が失せてしまう…。


GASを開く。

「拡張機能」→「Apps Script」をクリック。
※ここまでは知ってたけど、初めてのときはGASっていう表記がなくて迷った記憶…。

こんな画面が出てくるよ

関数名は、今後自分が分かりやすいように設定しておく(自由に決められる)。今回は、refreshCompletedTask に設定。


操作するスプレッドシートを指定する。

ここまでが基本的な準備

とりあえずこの辺は、スプシをいじるときの魔法の言葉と思って、コピペ。

▼操作するスプレッドシートを開くときのメモ▼
今回は、”openById”というメソッドを使用。
ここで言うIdは、スプシのリンクに記載があって、それを()の中に、””で囲って記入する。

https://docs.google.com/spreadsheets/d/ここにIDがある/edit#gid=0
調べてみると、"getActiveSpreadsheet"というメソッドもあるらしく、()に変数を指定しなくても良いらしいけど、どの状態がアクティブなのかよく分からなくて個人的に挙動が予想できないから、前述のメソッドを採用した。

同じ理由で、シートの指定の仕方も”getActiveSheet”というメソッドがあるものの、今回は”getSheetByName”というメソッドを使用。このあとにシートの名前を変えちゃうとうまく動かないかも!

※GASでは「スプレッドシート」と「シート」は、明確に分けてるらしいので要注意。スプシで”シート1”とか書いてる下のタブ一つひとつが「シート」、それら全部を含む上位の階層を「スプレッドシート」というらしい。




最終行・最終列の取得

8~9行目

"getLast~~"系のメソッドは、そのシート内で値の入っている、一番最後の行や列の位置を教えてくれるもの。
今回の例なら、"getLastRow"(行)の結果は「7」、”getLastColumn”(列)の結果は「6」になる。



繰り返しの書き方

11~13行目

出ました、for文。
繰り返す作業をするときに、絶対お見かけするもの。
今回の場合だと、上から一行ずつ条件に該当するかをチェックしてほしいので採用します。

▼for文を使うときのメモ▼
for文と切っても切れない関係なのが、"i"という謎の文字。これに数字を代入することで、作業の進捗を管理しているらしい。

今回の例を言葉で表すとすると、「iは1とします。iがrows(さっき7と分かっている)以下なら、{}内の命令を実行。それが終わったらiに1を追加」という感じ。
イメージは、命令を実行するたびに、iという名前の数取器をクリックしている感じ。

数取器



条件分岐の書き方

12~16行目

こちらも大御所、if文。
条件分岐をしたいときに使用するものですね。

ifの後の()に条件を書いて、真のときは最初の{}の命令を、偽のときはelse以降の{}の命令を実行してくれます。

▼if文を使うときのメモ▼
条件を複数重ねたいとき、スプシでいうAND関数やOR関数のように一気に処理することもできるようです。

ifの後の()に条件Aと条件Bを入れる際、
(条件A && 条件B)と書けば、条件A かつ 条件Bを満たすかどうかを判定してくれます。※AND関数と同じ

(条件A || 条件B)と書けば、条件A または 条件Bのいずれか一つでも満たすかを判定してくれます。※OR関数と同じ



チェックボックスがTRUE(☑)かFALSE(▢)かを確認する

12行目

getRangeメソッドでは、()に”行番号”と”列番号”を入れることで、該当するセルを指定でき、getValueメソッドでそのセルにどんな値が入っているかがわかるらしい。

今回は、チェックボックスなので、getValueメソッドの結果は”TRUE(☑)"か"FALSE(▢)”と出る想定です。

このGASでは、チェックが入っているときに作動してほしいので、trueのときが真になるよう、「===true」と記載しています。
※なぜ=が3つなのかはよく分かっていないけど、3つじゃないとだめっていうのは知っていたので、この表記を貫きます。

▼getRangeメソッドのメモ▼
今回は、チェックボックスがある列はどの行も変わらないため、列番号を「5」と固定で決めています。

反対に、行は繰り返し確認してほしいので、行番号を「i」にして、ループするたび「i」の値が1ずつ増え、指定する行が1行ずつ下がるようにしています。

この仕組みは自分で思いついたので、著者の賢いポイントです(褒めて)



セルが空白かどうかを確認する

12行目

さっきメモした「&&」を使って、”チェックボックスにチェックがある かつ ステータスが空白じゃない”という条件を表現しています。

isBlankメソッドは、対象のセルが空白ならtrue、それ以外はfalseを返すものだそう。
このツールは「転記済」「転記不要」以外は入力できないようにしているので、空白ではない場合、確実に削除対象になります。



範囲を指定し、値のみをクリアする

13行目

getRangeメソッドの別の使い方をしつつ、clearContentメソッドという新しいものを使用するという、いきなりびっくりな進化。

とりあえず分かりやすいclearContentメソッドについて。
このメソッドは選択したセルや範囲の値だけを削除するもの。値だけなので、書式は残ります。つまり、チェックボックスやプルダウンは残してくれる!最高!

getRangeメソッドが少し説明面倒。
()の中の前半2つはこれまで同様、"行番号"と”列番号”。
後半2つは、”行番号から何個分の行を選択するか”と”列番号から何個分の列を選択するか”を表現している。

今回の例で言うと、後半2つは”1,columns”となっているため、「1行分と、値が入っている最終列まで」ということになる。
※忘れられてそうだけど、columnsは最終列の取得のところであらかじめ設定していたよ。



IF文で、何もしないときの書き方

15行目

スクリプトはこれで最後!
最後の最後でいちばん簡単なの来た!😆
なんと、if文で何もしてほしくないときは、「;」の一文字だけを書けばいいらしい!なんて楽な…

次が作業の最後!



毎朝動くようにする

左側にアイコンだけが見えていて、カーソルを合わせると文字も見えるようになる

GASの作業画面の左側に目を向けると、目覚まし時計のようなアイコンがあるので、それをクリック。

最初はなにもない

右下の青い「+ トリガーを追加」というボタンをクリック。

デフォルトは少し画面が違うけど、説明通りに進めればこれと同じにできるよ

「実行する関数を選択」を”自分で設定した関数の名前(例ではrefreshCompletedTask)”を選ぶ。
「イベントのソースを選択」で”時間主導型”を
「時間ベースのトリガーのタイプを選択」で”日付ベースのタイマー”を
「時刻を選択」は”午前0時~1時”にする。
※時刻は、自分が絶対触らない時間が良いかも

これで保存を押すと完成!



実行してみよう

では早速、動かしてみましょう!

実行前

現在は上記のような感じ。
想定どおりであれば、3行目(タスク2)と5行目(タスク4)が消えるはず。

今回は午前0~1時まで待てないので、手動で実行してみます。

実行後

お見事!

以上!お疲れ様!

この記事が気に入ったらサポートをしてみませんか?