X投稿の予定かぶりを投稿前に発見|GASで投稿キューをdry-run監査

X投稿の予定かぶりを投稿前に発見|GASで投稿キューをdry-run監査

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

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

X投稿をまとめて準備したのに、同じ時刻へ複数行を入れたり、同じ本文を重ねたりすると、運用直前の手戻りが増えます。この記事では、投稿も予約も行わず、スプレッドシート上の予定時刻・本文・状態だけを検査する無料GASを紹介します。

先に知っておきたいこと

  • 投稿や予約は一切行いません。検査結果をログへ出すだけです。
  • 本文そのものをログへ残さず、重複照合用の短いハッシュだけを使います。
  • XのAPIや認証情報は不要です。
  • 実際の投稿可否や予約機能は、利用サービス側の仕様を別途確認してください。

準備するシート

シート名を「PostQueue」にし、1行目へ次の見出しを置きます。

  • A列: scheduled_at(例: 2026/08/27 09:00)
  • B列: text(投稿予定本文)
  • C列: status(draft または approved)

まずは実データのコピーで3〜5行だけ試してください。

コピーして使える最小コード

function auditXPostScheduleFree() {
  const DRY_RUN = true;
  const SHEET_NAME = 'PostQueue';
  const MAX_ROWS = 200;
  const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
  if (!sheet) throw new Error('PostQueue シートがありません');

  const lastRow = sheet.getLastRow();
  if (lastRow < 2) {
    console.log('検査対象がありません');
    return;
  }
  if (lastRow - 1 > MAX_ROWS) throw new Error('200行を超えています。範囲を分けてください');

  const rows = sheet.getRange(2, 1, lastRow - 1, 3).getValues();
  const timeSeen = new Map();
  const textSeen = new Map();
  const issues = [];

  rows.forEach((row, index) => {
    const rowNumber = index + 2;
    const scheduledAt = row[0];
    const text = String(row[1] || '').trim();
    const status = String(row[2] || '').trim().toLowerCase();

    if (!(scheduledAt instanceof Date) || isNaN(scheduledAt.getTime())) {
      issues.push({ row: rowNumber, type: 'INVALID_TIME' });
    }
    if (!text) issues.push({ row: rowNumber, type: 'EMPTY_TEXT' });
    if (!['draft', 'approved'].includes(status)) {
      issues.push({ row: rowNumber, type: 'INVALID_STATUS' });
    }

    if (scheduledAt instanceof Date && !isNaN(scheduledAt.getTime())) {
      const timeKey = Utilities.formatDate(scheduledAt, Session.getScriptTimeZone(), 'yyyy-MM-dd HH:mm');
      if (timeSeen.has(timeKey)) {
        issues.push({ row: rowNumber, type: 'DUPLICATE_TIME', firstRow: timeSeen.get(timeKey) });
      } else {
        timeSeen.set(timeKey, rowNumber);
      }
    }

    if (text) {
      const normalized = text.normalize('NFKC').replace(/\s+/g, ' ');
      const digest = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, normalized)
        .slice(0, 8).map(value => ('0' + (value & 255).toString(16)).slice(-2)).join('');
      if (textSeen.has(digest)) {
        issues.push({ row: rowNumber, type: 'DUPLICATE_TEXT', firstRow: textSeen.get(digest) });
      } else {
        textSeen.set(digest, rowNumber);
      }
    }
  });

  console.log(JSON.stringify({ dryRun: DRY_RUN, checkedRows: rows.length, issueCount: issues.length, issues }));
}

実行手順

1. 検証用スプレッドシートを開き、「拡張機能」からApps Scriptを開きます。

2. コードを貼り付け、プロジェクトのタイムゾーンを運用地域に合わせます。

3. auditXPostScheduleFree を実行します。

4. 実行ログで行番号とエラー種別を確認し、シートを手動で直します。

5. 修正後に再実行し、issueCount が0になったことを確認します。

失敗しやすい点と停止条件

  • 日時が文字列扱いの場合は INVALID_TIME で止め、表示形式を日時へ直します。
  • 同時刻が意図的でも、自動で解決せず担当者が順序を確認します。
  • 本文のわずかな表記差は別文として扱うため、最終目視確認も必要です。
  • 200行を超える場合は範囲を分け、実行時間の上限に余裕を持たせます。
  • このコードはシート更新、投稿、削除、外部送信を行いません。

まとめ

投稿予定表は、実行機能を足す前に「入力不備・時刻重複・本文重複」を見つけられる状態にすると安全です。まずdry-runのログだけで確認し、修正は人が判断してください。

X投稿作成・運用シートを見る

GasおじのTips商品一覧を見る

※学習・検証用の例です。実データへ適用する前にコピー環境で確認してください。Google公式・Google公認の商品ではありません。


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

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

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

この記事のライター

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

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

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

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

    ¥2,980
    1 %獲得
    (29 円相当)
  • あとで見るURLを二重登録しない|GASで読書・動画ウォッチリストをdry-run監査

  • X投稿の重複を出す前に止める|GASで投稿キューをdry-run監査

関連のおすすめ記事

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

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

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

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

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

    GoGorilla

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

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

    SmartSenior