朝のToDoが崩れる原因は通知より入力|期限・優先度をGASで事前チェック

朝のToDoが崩れる原因は通知より入力|期限・優先度をGASで事前チェック

Gasおじ|GoogleアカウントをAIエージェント化

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公認の商品ではなく、結果や時間削減を保証するものではありません。


あなたも記事の投稿・販売を
始めてみませんか?

Tipsなら簡単に記事を販売できます!
登録無料で始められます!

Tipsなら、無料ですぐに記事の販売をはじめることができます Tipsの詳細はこちら
 

この記事のライター

Gasおじ|GoogleアカウントをAIエージェント化

おう、Gasおじだ。 AIツールとSaaSに散々突っ込んで遠回りした結果、最後に強かったのは「今あるGoogleアカウント」だった。 今ではAIエージェントであらゆるタスクを自動化して無双してるぞ。 GAS、スプレッドシート、フォーム、Gmail、AIエージェントを組み合わせれば、個人でも小さな会社でも、手作業だらけの業務はかなり自動化できる。 ここでは机上のAI論じゃなく、現場で動くテンプレ、コード、手順だけを置いていくぞ。 高いツールを増やす前に、まずお前さんのGoogleアカウントを仕事するエージェントに変えようじゃないか。

このライターが書いた他の記事

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    1 %獲得
    (29 円相当)
  • GASのtry-catch入門|元データを守るエラー処理とログの実装例

  • Gasおじ式 X投稿キュー自動実行GAS Pro|危ない時だけ止まる

    ¥2,980
    1 %獲得
    (29 円相当)

関連のおすすめ記事

  • USBメモリで持ち運べるLinux Mint 22.1と永続的な書き込み領域の作成法【Rufus だけで作成する方法を初心者向けに徹底解説】

    ¥500
    1 %獲得
    (5 円相当)
    SmartSenior

    SmartSenior

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    1 %獲得
    (29 円相当)
    Gasおじ|GoogleアカウントをAIエージェント化

    Gasおじ|GoogleアカウントをAIエージェント化

  • 【Python】 Con-Que 【データベース接続】

    ¥3,000
    1 %獲得
    (30 円相当)
    GoGorilla

    GoGorilla