出品を続けていると、案件が2件3件と重なる日がきます。そうなると怖いのは、技術的な難しさより**単純な納期忘れ**です。
評価は一度落ちると戻りません。にもかかわらず、納期の管理はたいてい「スプレッドシートに書いて、ときどき見る」で運用されています。見るのを忘れたら終わりです。
そこで、**スプレッドシートを毎朝かわりに見てくれる仕組み**を作ります。Google Apps Script(GAS)で20行ほど。プログラミングの経験は要りません。コピペで動きます。
### 作るもの
毎朝8時に、スプレッドシートの「納期」列を見て、**今日が納期なのに納品済みでない案件があればメールで知らせる**。それだけです。
該当が無い日はメールが来ません。「何も来ない=今日は大丈夫」と分かるので、シートを開く習慣そのものが不要になります。
### 1. シートを用意する
Googleスプレッドシートを新規作成し、シート名を `案件` にします。1行目に見出しを入れて、A・B・C列を次のようにします。
| | A | B | C |
|---|---|---|---|
| 1 | 案件名 | 納期 | ステータス |
| 2 | ロゴ修正(〇〇様) | 2026/09/03 | 進行中 |
| 3 | バナー3点(△△様) | 2026/09/05 | 納品済 |
**B列の「納期」は、必ず日付として入力してください。**ここが後で一番つまずきます(理由は最後に書きます)。
C列に `納品済` と入れた行は通知の対象外になります。
### 2. コードを貼る
スプレッドシートのメニューから **拡張機能 → Apps Script** を開きます。最初から書かれているコードは全部消して、次をそのまま貼り付けてください。
```javascript
function notifyDueToday() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('案件');
const rows = sheet.getDataRange().getValues();
const todayStr = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
const due = [];
for (let i = 1; i < rows.length; i++) {
const name = rows[i][0];
const deadline = rows[i][1];
const status = rows[i][2];
if (!name || !deadline) continue;
if (status === '納品済') continue;
if (!(deadline instanceof Date)) continue;
const d = Utilities.formatDate(deadline, 'Asia/Tokyo', 'yyyy/MM/dd');
if (d === todayStr) due.push(name);
}
if (due.length === 0) return;
MailApp.sendEmail(
Session.getActiveUser().getEmail(),
'【本日納期】' + due.length + '件',
due.map(function (n) { return '・' + n; }).join('\n')
);
}
```
貼ったら保存し、上部の実行ボタンで一度動かします。初回だけGoogleから権限の確認画面が出るので許可してください。「このアプリは確認されていません」と出ますが、自分で書いたスクリプトなので問題ありません。詳細を開いて進めます。
B列に今日の日付が入った行があれば、自分宛にメールが届きます。届かない場合は、その日に該当行が無いだけかもしれません。B列を今日の日付にして再実行してみてください。
### 3. 毎朝動くようにする
Apps Scriptの画面の左側にある**時計のアイコン(トリガー)**を開き、右下の「トリガーを追加」を押します。
- 実行する関数: `notifyDueToday`
- イベントのソース: 時間主導型
- 時間ベースのトリガーのタイプ: 日付ベースのタイマー
- 時刻: 午前8時〜9時
保存すれば完成です。あとは毎朝、勝手に見てくれます。
### つまずくのはだいたいここ
**納期が文字列になっている。**セルに `9/3` と打ったつもりが、書式によっては文字列として保存されていることがあります。そうなると日付として比較できず、通知が飛びません。上のコードは `deadline instanceof Date` で日付以外を読み飛ばすので、**エラーは出ないのに静かに動かない**という形になります。
見分け方は簡単で、セルを選んだとき**右寄せで表示されていれば日付、左寄せなら文字列**です。左寄せだったら、B列を選択して「表示形式 → 日付」にしてから入力し直してください。
**シート名が違う。**コードの `getSheetByName('案件')` はシート名と完全に一致している必要があります。デフォルトの `シート1` のままなら、コード側を書き換えるか、シート名を変えてください。
### ここまでは自分でできます
この先は、どこから難しくなるか
ここで作ったのは「1つのシートを、1つの条件で、1日1回見る」仕組みです。この範囲なら、この記事のコピペで足ります。
難しくなるのは、条件が増えたときです。
「3日前にも知らせたい」なら、日付の差分を計算することになります。単純な引き算ではなく、土日を挟むか、月をまたぐかで期待する挙動が変わります。ChatworkやLINEに飛ばすなら UrlFetchApp と各サービスのトークン管理が加わり、トークンをコードに直接書かない置き場所も考える必要が出ます。複数シートをまたぐ集計は、たいていシートごとに列の並びが違うので、集計そのものより「構造を揃える作業」のほうが時間を食います。
つまり、増えるのはコードの行数ではなく確認すべき前提の数です。ここを軽く見ると「簡単なつもりが半日溶けた」になります。逆に言えば、前提が1つに定まっている作業なら、たいてい今日の記事の延長で片づきます。
なお、こうした小さな自動化は出品サービスとしてもお受けしています。
---
*この記事の作成にはAIを活用しています。掲載したコードは公開前に内容を確認していますが、ご自身の環境で試す際は、まずテスト用のスプレッドシートでお試しください。*