X投稿の予定かぶりを投稿前に発見|GASで投稿キューをdry-run監査
ツールおじ|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公認の商品ではありません。
