公開準備の「完了」に証跡がない|GASで状態とURLをdry-run監査
ツールおじ|GoogleアカウントをAIエージェント化
公開準備表では、状態を「完了」にしたのに、確認に使ったページやファイルのURLが空欄のままになることがあります。あとで見直そうとしても、何を根拠に完了としたのか分からなければ、確認をやり直さなければなりません。
この記事では、公開準備表の状態、証跡URL、確認状態の組み合わせを、セルを変更せずに点検する無料GASを紹介します。外部ページへアクセスせず、ログには行番号とエラー分類だけを残します。
先に知っておきたいこと
- できること:必須項目、状態、証跡URLの形式、確認状態の組み合わせを点検します。
- できないこと:URLのリンク先が開くか、内容が正しいか、公開してよいかは判断しません。
- 安全設計:セルの更新、ファイル操作、メール送信、外部通信、トリガー作成は行いません。
- ログ範囲:チェック項目名やURLは出さず、行番号とエラー分類だけを記録します。
- 停止条件:dryRunがtrueでない、見出しが一致しない、確認対象が200行を超える場合は処理を止めます。
学習・検証用の例です。最初は元シートのコピーと架空データで試してください。
準備するシート
シート名を「公開準備」にします。1行目のA列からD列へ、次の見出しを入力してください。
- チェック項目
- 状態
- 証跡URL
- 確認状態
状態は「未着手」「確認中」「完了」のいずれか、確認状態は「未確認」「確認済み」「要修正」のいずれかにします。証跡URLには、確認に使うページや共有可能なファイルのURLを入れます。秘密情報を含むURLや、購入者だけが利用するURLは入力しないでください。
テスト用には、次のような架空データを2〜4行だけ用意します。
- サムネイル確認|完了|空欄|確認済み
- 販売ページ確認|確認中|httpsで始まる架空URL|未確認
- 説明文確認|完了|httpsで始まる架空URL|確認済み
コピーして使える最小コード
function previewLaunchEvidenceAudit() {
const config = {
sheetName: '公開準備',
maxRows: 200,
dryRun: true
};
if (config.dryRun !== true) {
throw new Error('安全のためdryRunはtrue固定です。');
}
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName(config.sheetName);
if (!sheet) {
throw new Error('「公開準備」シートが見つかりません。');
}
const expectedHeaders = ['チェック項目', '状態', '証跡URL', '確認状態'];
const actualHeaders = sheet.getRange(1, 1, 1, 4)
.getDisplayValues()[0]
.map(function(value) {
return String(value).trim();
});
const headerMismatch = expectedHeaders.some(function(header, index) {
return actualHeaders[index] !== header;
});
if (headerMismatch) {
throw new Error('A1:D1の見出しを手順どおりにしてください。');
}
const lastRow = sheet.getLastRow();
const targetCount = Math.max(0, lastRow - 1);
if (targetCount > config.maxRows) {
throw new Error('確認対象が200行を超えています。範囲を分けてください。');
}
const rows = targetCount === 0
? []
: sheet.getRange(2, 1, targetCount, 4).getDisplayValues();
const allowedStatuses = ['未着手', '確認中', '完了'];
const allowedChecks = ['未確認', '確認済み', '要修正'];
const issues = [];
rows.forEach(function(row, index) {
const rowNumber = index + 2;
const item = String(row[0]).trim();
const status = String(row[1]).trim();
const evidenceUrl = String(row[2]).trim();
const checkStatus = String(row[3]).trim();
if ([item, status, evidenceUrl, checkStatus].every(function(value) {
return value === '';
})) {
return;
}
if (!item) {
issues.push({ row: rowNumber, code: 'ITEM_EMPTY' });
}
if (allowedStatuses.indexOf(status) === -1) {
issues.push({ row: rowNumber, code: 'STATUS_INVALID' });
}
if (allowedChecks.indexOf(checkStatus) === -1) {
issues.push({ row: rowNumber, code: 'CHECK_STATUS_INVALID' });
}
if (evidenceUrl && !/^https:\/\/[^\s]+$/.test(evidenceUrl)) {
issues.push({ row: rowNumber, code: 'EVIDENCE_URL_INVALID' });
}
if (status === '完了' && !evidenceUrl) {
issues.push({ row: rowNumber, code: 'DONE_WITHOUT_EVIDENCE' });
}
if (status === '完了' && checkStatus !== '確認済み') {
issues.push({ row: rowNumber, code: 'DONE_WITHOUT_CHECK' });
}
if (checkStatus === '確認済み' && !evidenceUrl) {
issues.push({ row: rowNumber, code: 'CHECKED_WITHOUT_EVIDENCE' });
}
if (evidenceUrl && checkStatus === '未確認') {
issues.push({ row: rowNumber, code: 'EVIDENCE_NOT_CHECKED' });
}
});
Logger.log('dry-run: true');
Logger.log('確認行数: ' + targetCount);
if (issues.length === 0) {
Logger.log('入力上の不整合: 0件');
} else {
issues.forEach(function(issue) {
Logger.log('行' + issue.row + ': ' + issue.code);
});
}
Logger.log('チェック項目名と証跡URLはログへ出していません。');
return {
status: issues.length === 0 ? 'OK' : 'HOLD',
checked: targetCount,
issues: issues.length
};
}実行手順
- 元のスプレッドシートをコピーします。
- コピー側に「公開準備」シートを作り、見出しと架空データを入力します。
- Apps Scriptへコードを貼り付け、previewLaunchEvidenceAuditを実行します。
- 実行ログで行番号とエラー分類を確認します。
- 元データは直接直さず、まずコピー側で該当行の状態と証跡を見直します。
エラー分類の読み方
- ITEM_EMPTY:チェック項目が空欄です。
- STATUS_INVALID:状態が許可した3種類に一致しません。
- CHECK_STATUS_INVALID:確認状態が許可した3種類に一致しません。
- EVIDENCE_URL_INVALID:証跡URLがhttpsで始まらないか、空白を含みます。
- DONE_WITHOUT_EVIDENCE:完了なのに証跡URLがありません。
- DONE_WITHOUT_CHECK:完了なのに確認状態が「確認済み」ではありません。
- CHECKED_WITHOUT_EVIDENCE:確認済みなのに証跡URLがありません。
- EVIDENCE_NOT_CHECKED:証跡URLはありますが、確認状態が「未確認」です。
同じ行に複数の不整合がある場合は、エラーも複数表示されます。たとえば「完了」「URL空欄」「確認済み」の行では、証跡がないことを示す2種類のエラーが出ます。
このコードが判断しないこと
このコードは、文字列の形式と状態の組み合わせだけを確認します。URLへアクセスしないため、リンク切れ、閲覧権限、ページの内容、公開日時、画像の見た目は確認できません。
「エラー0件」は、入力上の不整合が見つからなかったという意味です。公開可否や内容の正しさまで保証する結果ではありません。実際に公開する前は、権限のある担当者が証跡を開き、ページと画像を直接確認してください。
また、証跡URLにアクセストークン、署名付きURL、Secret Gist、購入者専用ページなどを入れないでください。このコードはURLをログへ出しませんが、シート自体の共有範囲は別途確認が必要です。
公開前チェックリスト
- 元のシートではなく、コピーしたシートで試した
- dryRunがtrueのままになっている
- 見出しがA1:D1の4列と一致している
- 架空データ2〜4行でエラー分類を確認した
- ログにチェック項目名やURLが出ていない
- 証跡URLのリンク先と閲覧権限は人が直接確認した
- Secret Gist、購入者専用URL、認証情報を入力していない
まとめ
公開準備表は、状態だけを「完了」にしても、あとから確認できる証跡がなければ判断を引き継げません。今回のコードは、完了・証跡URL・確認状態の組み合わせを、セル非更新、外部通信なしで点検します。
まずはコピーしたシートと架空データで実行し、エラーが出た行だけを見直してください。リンク先の内容や公開可否は自動判定せず、最後は実際のページを開いて確認します。
公開準備をフェーズ別に整理したい方へ

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

※このコードは学習・検証用です。Google公式・Google公認の提供物ではありません。Apps Scriptの仕様や利用上限は、利用環境によって異なります。
