技術ブログ

GAS×ChatGPT/Claudeでブログ記事を自動生成!コピペOK

/ 初心者向け

GAS×ChatGPT/Claudeでブログ記事を自動生成!コピペOK

Google Apps ScriptとChatGPT/Claude APIでブログ記事を自動生成しよう

「ブログ記事のネタ探しや執筆に時間がかかりすぎる…」「もっと効率的にブログを更新したい!」

そんな悩みを抱えていませんか?

この記事では、Google Apps Script(GAS)とChatGPTやClaudeといった生成AIのAPIを連携させ、ブログ記事を自動生成する方法を、初心者の方でもすぐに実践できるように、コピペできるGASコード付きで詳しく解説します。

この記事で解決できること

  • ChatGPT/Claude APIとGASの連携方法がわかる
  • ブログ記事のテーマ入力から生成、スプレッドシートへの記録までを自動化できる
  • コピペしてすぐに試せるGASコードが手に入る
  • 設定手順やよくあるエラーとその対処法がわかる

この記事を読めば、ブログ記事執筆の時間を劇的に短縮し、より創造的な作業に集中できるようになります。

準備するもの

1. Googleアカウント: GASを使うために必須です。

2. OpenAIまたはAnthropicのアカウント: ChatGPTまたはClaudeのAPIを利用するために必要です。

3. APIキー: 各サービスで取得したAPIキー。

4. Googleスプレッドシート: 生成された記事を保存するために使用します。

設定手順

ステップ1: Googleスプレッドシートの準備

まず、生成されたブログ記事を保存するためのスプレッドシートを作成します。以下のヘッダーを作成してください。

  • A列: タイトル
  • B列: 本文
  • C列: 生成日時

スプレッドシートのURLを控えておいてください。GASコード内で使用します。

ステップ2: GASプロジェクトの作成とAPIキーの設定

1. Googleドライブを開き、「新規」→「その他」→「Google Apps Script」を選択して、新しいスクリプトプロジェクトを作成します。

2. スクリプトエディタが開いたら、「ファイル」→「プロジェクトのプロパティ」→「スクリプトのプロパティ」に移動します。

3. 「プロパティを追加」ボタンをクリックし、以下の2つのプロパティを追加します。

  • OPENAI_API_KEY (ChatGPTの場合) または ANTHROPIC_API_KEY (Claudeの場合): 取得したAPIキーを入力します。
  • SPREADSHEET_ID: 作成したスプレッドシートのID(URLの /d//edit の間の文字列)を入力します。

ステップ3: GASコードの記述

以下のGASコードをスクリプトエディタに貼り付けます。ChatGPTとClaude、どちらを利用するかによって一部コードが異なりますので、ご自身の利用するAPIに合わせて選択してください。

【ChatGPT連携用コード】

function generateBlogPostChatGPT() {
  const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
  const spreadsheetId = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID');

  if (!apiKey || !spreadsheetId) {
    Logger.log('APIキーまたはスプレッドシートIDが設定されていません。スクリプトのプロパティを確認してください。');
    return;
  }

  // ブログのテーマをユーザーに入力させる(または、他の方法で取得する)
  const theme = Browser.inputBox('ブログ記事のテーマを入力してください:');
  if (!theme) {
    Browser.msgBox('テーマが入力されなかったため、処理を中断します。');
    return;
  }

  const prompt = `以下のテーマで、読者の検索意図に応えるような、SEOに強いブログ記事を作成してください。

テーマ: ${theme}

構成案:
1. 導入(読者の課題提起と解決策の提示)
2. 本文(具体的な解説、例、メリット・デメリットなど)
3. まとめ(要点の再確認、読者への行動喚起)

---`;

  const url = 'https://api.openai.com/v1/chat/completions';
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'headers': {
      'Authorization': 'Bearer ' + apiKey
    },
    'payload': JSON.stringify({
      'model': 'gpt-3.5-turbo',
      'messages': [
        {'role': 'system', 'content': 'あなたはSEOに強く、読者の検索意図を理解したブログ記事を作成するAIライターです。'},
        {'role': 'user', 'content': prompt}
      ],
      'max_tokens': 1000,
      'temperature': 0.7
    })
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const jsonResponse = JSON.parse(response.getContentText());
    const blogContent = jsonResponse.choices[0].message.content;

    // スプレッドシートに書き込み
    const ss = SpreadsheetApp.openById(spreadsheetId);
    const sheet = ss.getActiveSheet();
    const timestamp = new Date();
    sheet.appendRow([theme, blogContent, timestamp]);

    Browser.msgBox('ブログ記事の生成が完了し、スプレッドシートに保存されました!');
    Logger.log('ブログ記事が生成・保存されました:
' + blogContent);

  } catch (e) {
    Logger.log('APIリクエスト中にエラーが発生しました: ' + e.toString());
    Browser.msgBox('ブログ記事の生成中にエラーが発生しました。ログを確認してください。');
  }
}

【Claude連携用コード】

function generateBlogPostClaude() {
  const apiKey = PropertiesService.getScriptProperties().getProperty('ANTHROPIC_API_KEY');
  const spreadsheetId = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID');

  if (!apiKey || !spreadsheetId) {
    Logger.log('APIキーまたはスプレッドシートIDが設定されていません。スクリプトのプロパティを確認してください。');
    return;
  }

  // ブログのテーマをユーザーに入力させる(または、他の方法で取得する)
  const theme = Browser.inputBox('ブログ記事のテーマを入力してください:');
  if (!theme) {
    Browser.msgBox('テーマが入力されなかったため、処理を中断します。');
    return;
  }

  const prompt = `以下のテーマで、読者の検索意図に応えるような、SEOに強いブログ記事を作成してください。

テーマ: ${theme}

構成案:
1. 導入(読者の課題提起と解決策の提示)
2. 本文(具体的な解説、例、メリット・デメリットなど)
3. まとめ(要点の再確認、読者への行動喚起)

---`;

  const url = 'https://api.anthropic.com/v1/messages';
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'headers': {
      'x-api-key': apiKey,
      'anthropic-version': '2023-06-01' // 最新のAPIバージョンを指定
    },
    'payload': JSON.stringify({
      'model': 'claude-3-opus-20240229', // または 'claude-3-sonnet-20240229' など
      'max_tokens': 1000,
      'messages': [
        {'role': 'user', 'content': prompt}
      ],
      'temperature': 0.7
    })
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const jsonResponse = JSON.parse(response.getContentText());
    const blogContent = jsonResponse.content[0].text;

    // スプレッドシートに書き込み
    const ss = SpreadsheetApp.openById(spreadsheetId);
    const sheet = ss.getActiveSheet();
    const timestamp = new Date();
    sheet.appendRow([theme, blogContent, timestamp]);

    Browser.msgBox('ブログ記事の生成が完了し、スプレッドシートに保存されました!');
    Logger.log('ブログ記事が生成・保存されました:
' + blogContent);

  } catch (e) {
    Logger.log('APIリクエスト中にエラーが発生しました: ' + e.toString());
    Browser.msgBox('ブログ記事の生成中にエラーが発生しました。ログを確認してください。');
  }
}

ステップ4: スクリプトの実行

1. スクリプトエディタの上部にある関数のプルダウンメニューから、generateBlogPostChatGPT または generateBlogPostClaude を選択します。

2. 実行ボタン(▶︎)をクリックします。

3. 初回実行時には、スクリプトの承認を求められます。内容を確認し、「許可」してください。

4. ブログ記事のテーマを入力するダイアログが表示されるので、テーマを入力して「OK」をクリックします。

処理が完了すると、スプレッドシートに記事が保存され、完了メッセージが表示されます。

よくあるエラーと対処法

  • 「APIキーまたはスプレッドシートIDが設定されていません」
  • 原因: スクリプトのプロパティにOPENAI_API_KEY (またはANTHROPIC_API_KEY) および SPREADSHEET_ID が正しく設定されていない。
  • 対処法: プロジェクトのプロパティ設定を再度確認し、APIキーとスプレッドシートIDが間違いないか確認してください。
  • 「APIリクエスト中にエラーが発生しました: 401 Unauthorized」
  • 原因: APIキーが無効、または期限切れ。
  • 対処法: APIキーを再生成し、スクリプトのプロパティに正しく設定し直してください。
  • 「APIリクエスト中にエラーが発生しました: 400 Bad Request」
  • 原因: APIに送信したリクエストの形式が不正。
  • 対処法: GASコード内のAPIエンドポイントURL、ペイロード(payload)の形式が正しいか、特にモデル名やパラメータ (max_tokensなど) が指定されたAPI仕様に合っているか確認してください。Claudeの場合は anthropic-version ヘッダーも重要です。
  • 「APIリクエスト中にエラーが発生しました: 5xx Server Error」
  • 原因: API提供側のサーバーで一時的な問題が発生している。
  • 対処法: しばらく待ってから再度実行してみてください。解決しない場合は、API提供元のサポートに問い合わせることも検討してください。
  • 「スクリプトの承認を求められるが、許可できない」
  • 原因: Googleアカウントのセキュリティ設定や、管理者がスクリプトの実行を制限している場合。
  • 対処法: 管理者に確認するか、Googleアカウントのセキュリティ設定を見直してください。

FAQ

Q1: どのAIモデルを選べば良いですか?

  • ChatGPT: gpt-3.5-turboはコストパフォーマンスに優れ、多くの用途で十分な性能を発揮します。より高品質な記事を求める場合は gpt-4 シリーズを検討しましょう(ただし、API利用料は高くなります)。
  • Claude: claude-3-opus-20240229 は最高性能ですが、最も高価です。claude-3-sonnet-20240229 は性能とコストのバランスが取れています。claude-3-haiku-20240307 は最も高速かつ安価ですが、生成される内容の深みは限定的かもしれません。目的に応じて使い分けてください。

Q2: 生成される記事の質を向上させるには?

  • プロンプトの具体性: GASコード内のpromptをより詳細に、具体的(ターゲット読者、文体、含めたいキーワードなど)に指示することで、AIの生成する記事の質が向上します。
  • max_tokensの調整: 生成される記事の長さを調整できます。長文の記事を生成したい場合は、この値を大きくしてください。
  • temperatureの調整: 値を高くするほど、より創造的で多様な文章が生成されます。低くするほど、より予測可能で一貫性のある文章になります。ブログ記事の場合は0.7程度がバランスが良いでしょう。
  • ファインチューニング (上級者向け): 特定の文体や知識に特化させたい場合は、AIモデルのファインチューニングを検討することもできますが、GASの範囲を超える高度な設定となります。

Q3: 生成された記事はそのまま公開できますか?

AIが生成した記事は、あくまで下書きや参考として利用することを強く推奨します。公開前に必ず以下の点を確認・修正してください。

  • 事実確認: AIは誤った情報を生成することがあります。記事の内容に間違いがないか、ご自身で必ず確認してください。
  • 表現の調整: AIの表現が不自然な場合や、ご自身のブログのトーンに合わない場合は、人間らしい自然な表現に修正しましょう。
  • オリジナリティの確保: 他のサイトとの類似性が高すぎないか確認し、必要に応じて独自の視点や経験談を加えてください。
  • SEO対策の最終確認: タイトルや見出し、本文中のキーワードが適切か、検索意図に合っているか最終確認してください。

まとめ

Google Apps ScriptとChatGPT/Claude APIを連携させることで、ブログ記事の自動生成が現実のものとなります。今回ご紹介したGASコードと設定手順を参考に、ぜひご自身のブログ運営に活用してみてください。

この技術は、ブログ記事だけでなく、メールの自動作成、SNS投稿文の生成、レポート作成など、様々な業務の自動化に応用可能です。もし、これらの業務自動化ツール導入や、より複雑なGASスクリプト開発についてご相談されたい場合は、お気軽にお声がけください。

AIの力を借りて、あなたのコンテンツ制作を次のレベルへと引き上げましょう!

GAS自動化の導入相談

請求書PDF作成、Gmail自動送信、Slack通知、スプレッドシート連携などを業務に合わせて実装できます。

請求書自動生成ツールを見る / SNS自動投稿ツールを見る