朝のToDoが崩れる原因は通知より入力|期限・優先度をGASで事前チェック
Gasおじ|GoogleアカウントをAIエージェント化
毎朝のToDo一覧が役に立たなくなる原因は、通知方法より前にあります。期限が文字列になっている、優先度の表記が揺れている、タスク名が空欄のまま、といった入力の乱れです。
この記事では、元のタスク表を変更せず、期限・優先度・状態を事前検査する無料のGASを作ります。最初はdry-runで結果を実行ログだけに出し、確認後に専用ログシートへ記録できます。
先に知っておきたいこと
- 対象は自分で管理するGoogleスプレッドシートです。
- メール送信、タスク削除、完了処理、外部サービスへの通知は行いません。
- dry-runの初期値は有効です。元のタスク表は書き換えません。
- 期限切れや未入力を「業務上どう扱うべきか」は判断せず、入力状態だけを検査します。
- Apps Scriptの実行時間や利用上限は、アカウントや利用状況によって異なります。
準備するシート
新しいスプレッドシートを作り、シート名を MorningTodoInput にします。1行目には次の5列を左から並べてください。
- タスク
- 区分
- 優先度
- 期限
- 状態
入力例は次のとおりです。
- 請求書を確認 / 事務 / 高 / 2026/08/13 / 未完了
- 商品説明を見直す / 販売 / 中 / 2026/08/14 / 未完了
- 週次メモを整理 / 振り返り / 低 / 2026/08/15 / 完了
優先度は 高・中・低、状態は 未完了・完了 のいずれかにそろえます。期限を空欄にする場合はエラーではなく「要確認」として扱います。
コピーして使える最小コード
Apps Scriptを開き、次のコードを貼り付けてください。最初は DRY_RUN を true のまま実行します。
const MORNING_TODO_CHECK_CONFIG = {
SHEET_NAME: 'MorningTodoInput',
LOG_SHEET_NAME: 'ValidationLog',
DRY_RUN: true,
ALLOWED_PRIORITIES: ['高', '中', '低'],
ALLOWED_STATUSES: ['未完了', '完了']
};
function validateMorningTodoInputFree() {
const config = MORNING_TODO_CHECK_CONFIG;
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName(config.SHEET_NAME);
if (!sheet) {
throw new Error('シート「' + config.SHEET_NAME + '」が見つかりません。');
}
const values = sheet.getDataRange().getValues();
if (values.length < 2) {
throw new Error('確認するデータ行がありません。');
}
const expectedHeaders = ['タスク', '区分', '優先度', '期限', '状態'];
const headers = values[0].map(function(value) {
return String(value).trim();
});
if (headers.join('|') !== expectedHeaders.join('|')) {
throw new Error('見出しを「' + expectedHeaders.join(' / ') + '」の順にそろえてください。');
}
const checkedAt = new Date();
const today = new Date(checkedAt.getFullYear(), checkedAt.getMonth(), checkedAt.getDate());
const results = [];
values.slice(1).forEach(function(row, index) {
const rowNumber = index + 2;
const task = String(row[0]).trim();
const category = String(row[1]).trim();
const priority = String(row[2]).trim();
const dueDate = row[3];
const status = String(row[4]).trim();
const messages = [];
if (!task) messages.push('タスクが未入力');
if (!category) messages.push('区分が未入力');
if (!config.ALLOWED_PRIORITIES.includes(priority)) {
messages.push('優先度は「高・中・低」のいずれか');
}
if (!config.ALLOWED_STATUSES.includes(status)) {
messages.push('状態は「未完了・完了」のいずれか');
}
if (dueDate === '') {
messages.push('期限が未入力');
} else if (!(dueDate instanceof Date) || isNaN(dueDate.getTime())) {
messages.push('期限が日付として認識されていない');
} else {
const normalizedDue = new Date(dueDate.getFullYear(), dueDate.getMonth(), dueDate.getDate());
if (status === '未完了' && normalizedDue < today) {
messages.push('未完了のまま期限切れ');
}
}
results.push([
checkedAt,
rowNumber,
task || '(空欄)',
messages.length ? '要確認' : 'OK',
messages.join(' / ') || '入力形式に問題なし'
]);
});
const summary = results.reduce(function(counts, row) {
counts[row[3]] = (counts[row[3]] || 0) + 1;
return counts;
}, {});
console.log(JSON.stringify({ dryRun: config.DRY_RUN, summary: summary, results: results }));
if (config.DRY_RUN) {
console.log('dry-runのためValidationLogへの書き込みは行いません。');
return results;
}
let logSheet = spreadsheet.getSheetByName(config.LOG_SHEET_NAME);
if (!logSheet) {
logSheet = spreadsheet.insertSheet(config.LOG_SHEET_NAME);
logSheet.appendRow(['確認日時', '元の行', 'タスク', '判定', '確認内容']);
}
logSheet.getRange(logSheet.getLastRow() + 1, 1, results.length, results[0].length).setValues(results);
return results;
}dry-runで確認する手順
1. 元データではなく、まずはサンプル用のスプレッドシートで試します。
2. 拡張機能からApps Scriptを開き、コードを保存します。
3. validateMorningTodoInputFree を選び、実行します。
4. 初回だけ表示される権限内容を確認します。
5. 実行ログを開き、dryRun が true であることを確認します。
6. summary の OK と 要確認 の件数を見ます。
7. results で元の行番号と確認内容を照合します。
dry-run中はValidationLogを作らず、元のタスク表も変更しません。見出しが違う場合やデータ行がない場合は、途中で止まって理由を表示します。
確認結果をログへ残す
実行ログで問題がないことを確認できたら、DRY_RUN を false に変えてもう一度実行します。このときだけValidationLogシートを作り、確認日時・元の行番号・判定・確認内容を追記します。
元のMorningTodoInputシートは変更しません。修正が必要な行は、ValidationLogの行番号を見ながら自分で確認してください。自動修正を行わないため、意図しない期限や優先度への書き換えを避けられます。
失敗しやすい点
- 期限を 8月13日ごろ のような文章で入力すると、日付として認識されない場合があります。
- 優先度に 最優先 や 普通 を混ぜると、許可した3種類と一致しません。
- 状態に 済・対応中 などを使う場合は、許可する値を自分の運用に合わせて変更してください。
- 空行も1行として読み取る場合があります。不要な行はシート上で削除してから確認します。
- 共有シートで使う場合は、検査対象とログの閲覧権限を先に確認してください。
公開前チェックリスト
- 元のタスク表を自動修正しない
- dry-runの実行ログを先に確認する
- 期限切れを自動削除・自動完了にしない
- 個人情報や認証情報をタスク名・ログへ入れない
- 優先度と状態の許可値を運用前に固定する
- 少量のサンプルで確認してから実データへ使う
まとめ
朝の確認を整える前に、タスク名・優先度・期限・状態の入力をそろえることが大切です。このコードは元データに触れず、まずdry-runで乱れを見つけます。
毎朝のToDoを区分・優先度・期限つきでまとめる運用まで広げたい場合は、関連する有料Tipsで機能範囲と注意点を確認できます。
Morning ToDo Mail Pro(朝のToDoメールGAS)を見る

Gasおじのほかの商品も、Tips内の一覧から確認できます。
GasおじのTips商品一覧を見る

※この記事は学習・検証用の例です。実データへ適用する前にコピー環境で確認してください。Google公式・Google公認の商品ではなく、結果や時間削減を保証するものではありません。
