公開準備の「完了」に証跡がない|GASで状態とURLをdry-run監査

公開準備の「完了」に証跡がない|GASで状態とURLをdry-run監査

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

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

公開準備表では、状態を「完了」にしたのに、確認に使ったページやファイルのURLが空欄のままになることがあります。あとで見直そうとしても、何を根拠に完了としたのか分からなければ、確認をやり直さなければなりません。

この記事では、公開準備表の状態、証跡URL、確認状態の組み合わせを、セルを変更せずに点検する無料GASを紹介します。外部ページへアクセスせず、ログには行番号とエラー分類だけを残します。

先に知っておきたいこと

  • できること:必須項目、状態、証跡URLの形式、確認状態の組み合わせを点検します。
  • できないこと:URLのリンク先が開くか、内容が正しいか、公開してよいかは判断しません。
  • 安全設計:セルの更新、ファイル操作、メール送信、外部通信、トリガー作成は行いません。
  • ログ範囲:チェック項目名やURLは出さず、行番号とエラー分類だけを記録します。
  • 停止条件:dryRunがtrueでない、見出しが一致しない、確認対象が200行を超える場合は処理を止めます。

学習・検証用の例です。最初は元シートのコピーと架空データで試してください。

準備するシート

シート名を「公開準備」にします。1行目のA列からD列へ、次の見出しを入力してください。

  1. チェック項目
  2. 状態
  3. 証跡URL
  4. 確認状態

状態は「未着手」「確認中」「完了」のいずれか、確認状態は「未確認」「確認済み」「要修正」のいずれかにします。証跡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
  };
}

実行手順

  1. 元のスプレッドシートをコピーします。
  2. コピー側に「公開準備」シートを作り、見出しと架空データを入力します。
  3. Apps Scriptへコードを貼り付け、previewLaunchEvidenceAuditを実行します。
  4. 実行ログで行番号とエラー分類を確認します。
  5. 元データは直接直さず、まずコピー側で該当行の状態と証跡を見直します。

エラー分類の読み方

  • 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の仕様や利用上限は、利用環境によって異なります。


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

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

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

この記事の販売者

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

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

この販売者が書いた他の記事

  • Gmailの予約送信ミスを送信前に発見|GASで宛先・日時をdry-run監査

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

    ¥2,980
    1 %獲得
    (29 円相当)
  • スプレッドシートの入力ミスを公開前に発見|GASでルール表をdry-run監査

関連のおすすめ記事

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

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

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

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

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

    SmartSenior

  • 毎朝のToDoを区分・優先度・期限つきでまとめる Morning ToDo Mail Pro

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

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