ネットのテンプレートやAIを活用してGoogle Apps Script(GAS)をカスタマイズしたいけれど、プログラミングは難しそう…そう感じていませんか?
事務業務において、プログラミングのハードルは決して低くはありません。
しかし、コードを書くのはAIやプログラマーに任せるとしても、基本的な仕組みを少し理解し、自分で調整できるようになれば、業務の幅が一気に広がります。
そこで今回は、よくある期日管理のGASスクリプトを使い、「まずはちょっとだけ理解してカスタマイズができる」ことを目的に、GASのコードの仕組みを解説していきます。
A列にタスク名、B列に期日が記載してあります。期日が過ぎたらメールを送る、というシンプルなコードを書いてみます。
まず全体のコードはこちら
---------------------
function remindOverdueTasks() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data = sheet.getDataRange().getValues();
var today = new Date();
for (var i = 1; i < data.length; i++) {
var task = data[i][0]; // A列(タスク名)
var dueDate = new Date(data[i][1]); // B列(期日)
var notified = data[i][2]; // C列(通知済みかどうか)
if (dueDate < today && notified !== "通知済み") {
MailApp.sendEmail("example@example.com", "【期限切れ】" + task, "タスクの期限が過ぎています!");
sheet.getRange(i + 1, 3).setValue("通知済み"); // C列に「通知済み」と記入
}
}
}
---------------------
このまま見てもわからないので、注目すべきはココ!
getValues(); ですべての値を取得
まず、getValues();
で、シート内のすべての値を取得します。 これを書いた時点で、データの中身はこんな感じになっています。
date0の中に1行目、1の中に2行目、という感じですね。
["タスク名", "期日"], // data[0](ヘッダー)
["提出物準備", "2025/03/20"], // data[1]
["会議資料作成", "2025/03/22"] // data[2]
ループ処理の仕組み
次に見るべきはココ!
for (var i = 1; i < data.length; i++)
for
はループ処理をするための構文です。
変数 i
を1から順番に増やしていき、データの行数 (data.length
) に達するまで繰り返します。
具体的にどういう動きをしているのか、次の行を見てみましょう。
var task = data[i][0]; // A列(タスク)
これは data[i][0]
つまり A列
のデータを取得して変数 task
に格納する処理です。
つまり、
data[i][0] = A列の値
data[i][1] = B列の値
data[i][2] = C列の値 …
というように、i が増えるごとに異なる行の値を処理しているわけです。
i の値 | data[i][0] の値 |
説明 |
---|---|---|
1 | "提出物準備" | data[1][0] → 2行目のA列 |
2 | "会議資料作成" | data[2][0] → 3行目のA列 |
この仕組みを理解しておけば、プログラマーさんが書いたサンプルコードなどを見ながらカスタマイズすることができ、行や列が変わっても対応が可能になります!
for
の中の処理を分解
for
の中で何をしているか、細かく見てみましょう。
コード | 何をしているか |
var i = 1; |
変数 i に 1 を入れる(カウント開始) |
i < data.length; |
i が data.length (行数)より小さい間、ループを続ける |
i++ |
ループが1回終わるごとに i を1増やす |
このようにすることで、1行目(タイトル部分)を飛ばして、2行目以降を順番に処理することができます。
期限切れの判定 if (dueDate < today)
ここで if
の部分を見てみましょう。
if (dueDate < today) {
これは、「期日が今日より前だったら」という条件です。
dueDate
に格納されている値が today
より小さい場合(過去の日付の場合)、メールを送信する処理が実行されます。
Excelなどでもおなじみ「もし〜だったら」という構文なのでわかりやすいですね。
カスタマイズしてみよう!
このままだと、スクリプトを実行するたびに同じタスクについて何度もメールが送られてしまいます。一度実行するだけなら良いですが、トリガーを設定して数時間に一回するような場合は不便になってしまうでしょう。
そこで、通知済みのタスクを記録する仕組みを加えます。
C列
に「通知済み」を記録する
for
の中に次のコードを追加します。
var notified = data[i][2]; // C列(通知済みかどうか)
sheet.getRange(i + 1, 3).setValue("通知済み"); // i+1は行番号、3はC列
これで、メールを送信した後にC列に「通知済み」と記録され、次回の実行時には通知をスキップできるようになります。
ついでに、時間のズレで誤判定される可能性を防ぐために時間情報をリセットするコードを付け加えました。(set Hoursのところ)
最終コード
-----------------------
function remindOverdueTasks() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data = sheet.getDataRange().getValues(); // シートの全データを取得
var today = new Date();
today.setHours(0, 0, 0, 0); // 時刻をリセット
for (var i = 1; i < data.length; i++) {
var task = data[i][0]; // A列(タスク名)
var dueDate = new Date(data[i][1]); // B列(期日)
var notified = data[i][2]; // C列(通知済みかどうか)
dueDate.setHours(0, 0, 0, 0); // 時間情報を削除
if (dueDate < today && notified !== "通知済み") { // 期限切れ & まだ通知してないなら
MailApp.sendEmail("example@example.com", "【期限切れ】" + task, "タスクの期限が過ぎています!");
// C列に「通知済み」と記入
sheet.getRange(i + 1, 3).setValue("通知済み"); // i+1は行番号、3はC列
}
}
}
--------------------------
修正ポイント
✅ C列(3列目)に「通知済み」と書き込む
✅ 既に「通知済み」のタスクはスルー
✅ 期限が過ぎた時点で1回だけ通知される
▼実行後
このように、「コードを書くのはちょっと難しい…」という方でも、ちょっとGASのコードを理解するだけで、簡単にカスタマイズできるようになります。
ぜひ挑戦してみてください!
なお、もっと勉強してみたい!という方には、GASの書籍もおすすめです。
▼おすすめ書籍はこちら
▼GASの初回導入手順はこちら
▼ 役に立ったらブックマークお願いします!