はじめに
備忘録と情報展開のために、普段のブラウザ操作を記録し、その内容からQiitaやSNS向けの記事を生成・投稿する仕組みを構築しています。
この仕組みは、SNS投稿だけでなく、操作マニュアルの作成にも応用できると考えています。
本記事では、Google Apps Script(GAS)、Google Drive、Google Sheets、Google Docs、Google Workspace Studio、Qiita APIを組み合わせ、記事原稿の生成から人間の確認、承認、投稿までをつなぐ方法を紹介します。
この記事も、今回構築した仕組みで原稿を準備し、人間が内容と機密情報を確認・承認した後、Qiita APIを通じて投稿しています。
現時点では人間による最終確認を必須としているため、完全自動投稿ではなく、「承認付き自動投稿」として設計しています。
こんな人におすすめ
- 技術ブログを書きたいが、記録の整理や文章化に時間を取られている人
- GASを使ってGoogle Workspace内の作業を自動化したい人
- AIを業務フローへ組み込みつつ、人間による確認工程も残したい人
- QiitaやSNSへの投稿作業を一元管理したい人
このシリーズで作るもの
最終的には、次の流れを自動化します。
- Chrome拡張でブラウザ操作とスクリーンショットを記録する
- 操作記録をGoogle DriveとGoogle Sheetsへ保存する
- Google Workspace StudioでQiita原稿を生成する
- 人間がGoogle Docsで内容と画像を確認する
- GASサイドバーから媒体ごとに承認する
- Qiita、Instagram、ThreadsへAPIで投稿する
- 投稿結果、公開URL、エラーをGoogle Sheetsへ記録する
第1回では、サンプルの操作記録を使って、Qiita原稿の生成・承認とQiita API接続までを扱います。
Chrome拡張による実際の操作記録、Instagram・Threadsへの投稿、予約投稿、Discord通知は今後の回で実装します。
なぜこの仕組みを作るのか
作業内容を記録として残し、他の人にも共有したいと思っても、スクリーンショットの整理や文章化、媒体ごとの書き換え、投稿作業が負担になると、継続が難しくなります。
そこで、人間が行う作業を「内容確認と最終承認」に絞り、それ以外をできるだけGoogle Workspace上でつなぐことを目標にしました。
AIの従量課金APIは使用せず、Google Workspace契約内で利用できるGoogle Workspace StudioのGeminiを文章生成に使います。
全体構成
今回の構成は次の通りです。
- Google Drive: 操作記録、画像、原稿、プロンプト、ログを保存
- Google Sheets: 記事、手順、画像、投稿、実行履歴、設定を管理
- Google Docs: AI入力資料と人間が確認する投稿原稿を保存
- Google Workspace Studio: GeminiによるQiita・SNS原稿生成
- GAS: 状態管理、承認UI、監視、再試行、API連携を担当
- Qiita API: 承認済みの記事を投稿
- clasp: GASコードをローカルで管理して反映
処理の流れ
ブラウザ操作・スクリーンショット
↓
Google Drive / Google Sheetsへ保存
↓
Google Workspace Studioで原稿生成
↓
Google Docsで人間が確認・修正
↓
GASサイドバーで承認
↓
Qiita APIで投稿
↓
投稿ID・公開URL・エラーをSheetsへ記録
Google Driveのフォルダ構成
プロジェクト用フォルダの下に、用途別のフォルダを作成しました。
auto_SNS/
├── 00_管理
├── 01_操作記録
├── 02_記事
├── 03_画像
├── 04_プロンプト
├── 05_ログ
└── 99_一時ファイル
フォルダIDはGoogle Sheetsへ直接書かず、GASのスクリプトプロパティで管理しています。
Google Sheetsの管理テーブル
1つのスプレッドシートに、次のシートを作成しました。
| シート | 用途 |
|---|---|
| articles | 記事単位のタイトル、状態、Qiita原稿URL |
| steps | 操作手順、URL、クリック対象、説明 |
| assets | スクリーンショットや生成画像 |
| masks | 機密情報のマスク範囲 |
| posts | 媒体ごとの原稿、承認、予約、投稿結果 |
| prompts | AI生成プロンプトとバージョン |
| runs | 処理結果、再試行、エラー履歴 |
| settings | 人間が変更する運用設定 |
投稿状態は、GENERATING、REVIEW_REQUIRED、APPROVED、PUBLISHED、FAILEDなどで管理します。
GASとclaspの準備
Google Sheetsに紐づくGASプロジェクトを作成し、claspでローカルへクローンしました。
npm install -g @google/clasp
clasp login
clasp clone <SCRIPT_ID>
clasp push
タイムゾーンはappsscript.jsonでAsia/Tokyoに固定しています。
秘密情報はスクリプトプロパティへ保存し、Git、Google Sheets、実行ログには出力しません。
Workspace StudioでQiita原稿を生成する
GASでarticles、steps、assetsの情報をGoogle Docsへまとめ、Workspace Studioの入力資料として使用します。
Workspace Studioのフローは、概ね次の3ステップです。
- Google Sheetsの対象行変更を検知する
- GeminiへAI入力資料と生成指示を渡す
- 生成した原稿をGoogle Docsとして保存する
生成指示には、次の制約を入れています。
- 日本語のMarkdownで作成する
- 記録にない事実を断定しない
- 不明点やAI補足を人間が識別できるようにする
- 機密情報を出力しない
- 操作手順、注意事項、完了確認を含める
Geminiへ渡す生成指示の例
実際のプロンプトはGoogle Driveでバージョン管理しています。以下は、設計意図が分かるように簡略化した例です。
添付されたAI入力資料に記録された操作手順と画像を使用し、
日本語のQiita記事をMarkdownで作成してください。
記録にない事実を断定しないでください。
不明点やAIが補足した内容には「AI補足・要確認」と明記してください。
概要、目的、前提条件、番号付きの操作手順、注意事項、
完了確認を含めてください。
完成した記事本文だけを出力してください。
GAS側では、記事、操作手順、画像を記事IDで関連付け、1つのGoogle Docsへ整形してからWorkspace Studioへ渡します。これにより、Geminiへ渡す情報源を限定し、記録にない内容が混ざる可能性を減らしています。
GASは生成中の記事を定期監視し、完成したGoogle Docsを検出すると、REVIEW_REQUIREDへ更新します。
生成がタイムアウトした場合は再試行し、上限を超えたらFAILEDとしてrunsシートへ記録します。
人間による確認と承認
生成した原稿は、公開前に必ずGoogle Docsで確認します。
主な確認項目は次の通りです。
- 記録にない内容が追加されていないか
- アクセストークンや個人情報が含まれていないか
- スクリーンショットに機密情報が写っていないか
- 実装済み機能と今後の予定が混同されていないか
- タイトル、本文、タグが適切か
確認後、articles.sensitive_data_checkedをオンにします。
GASサイドバーでは、選択中の記事、Qiita原稿へのリンク、媒体別状態、エラーを確認できます。機密確認が完了していない原稿は承認できません。
Qiita APIの準備
Qiitaの設定画面でアクセストークンを発行し、次のスコープを付与しました。
read_qiitawrite_qiita
Qiita Team用のスコープは使用していません。
発行したトークンは、GASのスクリプトプロパティQIITA_ACCESS_TOKENへ保存します。
疎通確認では、投稿を行わないGET /api/v2/authenticated_userを使用し、認証ユーザーを取得できることを確認しました。
投稿時に必要な安全対策
Qiita投稿処理には、少なくとも次の確認を入れます。
- 記事とQiita投稿が承認済みである
- 機密情報確認が完了している
- 承認後に原稿が変更されていない
- 既に外部投稿IDが保存されていない
- 同じ記事を並行して投稿しない
- APIエラーを
runsシートへ記録する - 投稿成功後にQiitaの記事IDと公開URLを保存する
この確認により、未承認投稿や二重投稿を防ぎます。
現在できていること
第1回の執筆時点では、次の機能を確認済みです。
- DriveとSheetsの管理基盤
- サンプル操作手順と画像の関連付け
- Workspace StudioによるQiita原稿生成
- Google Docsへの画像挿入
- 生成監視、タイムアウト、再試行
- GASサイドバーによるQiita・Instagram・Threadsの個別承認
- 承認済みQiita原稿からInstagram・Threads原稿を生成
- Qiita APIの認証確認
一方、次の機能は今後実装します。
- Chrome拡張による実際のブラウザ操作記録
- 画像へのクリック位置表示と機密情報マスク
- Instagram用画像の生成とAPI投稿
- Threads API投稿
- 媒体ごとの予約投稿
- Discord通知
この記事から持ち帰れること
この記事の構成を参考にすると、次のような承認付き投稿基盤を作れます。
- Google Sheetsを簡易データベースとして記事と投稿状態を管理する
- Google Workspace Studioを従量課金AI APIの代わりに文章生成へ利用する
- Google Docsを人間による確認・修正画面として使う
- GASサイドバーで未確認原稿の承認を防ぐ
- スクリプトプロパティでAPIトークンを安全に管理する
- 実行履歴とエラーを残し、再試行や二重投稿防止へつなげる
まとめ
Google Workspaceを中心に構成することで、操作記録、原稿生成、人間の確認、承認、API投稿を1つの流れとして管理できるようになりました。
重要なのは、AIへ投稿を丸投げせず、事実確認と機密情報確認を人間の承認工程として残すことです。
次回は、承認済みQiita原稿からInstagramとThreadsの原稿を生成し、媒体ごとに個別承認・差し戻しする仕組みを紹介します。