「毎日決まった時間に、自分の気になるジャンルの最新ニュースをチェックしたい」……そう思ったことはありませんか?

最初はGeminiに直接「毎日送って」と頼んでみたのですが、残念ながらGemini単体ではスケジュール実行ができないとの回答。そこで、**Google Apps Script(GAS)**を組み合わせて、理想のメールマガジン配信システムを自作しました。

目次

このシステムのメリット

  • 低コスト(ほぼ無料): 自分のAPIキーを使用するため、個人利用の範囲内であれば実質無料で運用できます。
  • 自分好みにカスタマイズ: 検索キーワードや件数を自由に変更可能です。
  • 完全自動: 一度設定すれば、PCを開いていなくても毎日メールが届きます。

導入の手順

準備はたったの2ステップです。

1. Google AI StudioでAPIキーを取得

まず、Geminiを外部から動かすための「鍵」を取得します。

詳細

1. Google AI Studioにアクセスする

まずは、開発者向けの環境である Google AI Studio にアクセスします。

  • Googleアカウントでのログインが必要です。
  • 初めての場合、利用規約への同意を求められるので、内容を確認して進めてください。

2. 「Get API key」メニューを開く

画面の左側にあるサイドバーに注目してください。鍵のアイコンが付いた 「Get API key」 という項目があります。ここがAPI管理の司令塔です。

3. APIキーを生成する

「Get API key」をクリックすると、管理画面が表示されます。以下の手順でキーを発行します。

  1. 画面上部にある 「Create API key」(または Create API key in new project)ボタンをクリックします。
  2. 既存のGoogle Cloudプロジェクトがある場合はそれを選択し、初めての場合は新しいプロジェクトとして作成します。
  3. 数秒待つと、英数字の長い文字列(APIキー)が表示されます。

4. キーの保存とセキュリティ(重要!)

発行されたキーは、その場ですぐに 「Copy」 ボタンを押して安全な場所にメモしてください。

[!WARNING] APIキーは「銀行の暗証番号」と同じです。

  • GitHubなどの公開リポジトリに絶対にプッシュしないでください。
  • 万が一漏洩した場合は、この画面からすぐに「Delete」して無効化しましょう。

2. Google Apps Script(GAS)でプロジェクトを作成

次に、プログラムを動かすための環境を準備します。

  • Google Apps Script にアクセスし、「新しいプロジェクト」を作成します。

詳細

APIキーが「鍵」なら、Google Apps Script(GAS)はそれを差し込んで動かす「エンジン」です。


1. GASダッシュボードへアクセス

まずは、以下のURLをブックマークしておきましょう。

2. 「新しいプロジェクト」を起動

画面左上にある大きな 「+ 新しいプロジェクト」 ボタンをクリックします。

3. エディタ画面の構成を知る

ボタンを押すとすぐに、コードを書き込むエディタ画面が開きます。

ブログで解説する際に「どこを操作するか」を指し示しやすいよう、主要なパーツを整理しておきましょう。

パーツ名役割
プロジェクト名左上の「無題のプロジェクト」。クリックして名前を変更。
サイドバーファイル構成、トリガー(自動実行設定)、実行ログを確認。
エディタエリア実際にJavaScript(GAS)を記述する場所。
ツールバー保存、実行、デバッグ、デプロイ(公開)を行う。

4. 最初の保存(ここがポイント!)

GASは、一度実行するか、手動で保存(Ctrl+S / Cmd+S)するまでプロジェクト名が確定しません。

  1. 左上の「無題のプロジェクト」をクリックし、Gemini_Verification_Project などと入力。
  2. 「名前を変更」を押すと、Googleドライブにも自動的にファイルとして保存されます。
  • 開いたエディタに、以下のコードを貼り付けてください。

実装するプログラムコード

あなたのAPIキーメールアドレス の部分は、ご自身のものに書き換えて使用してください。

JavaScript

// --- 設定項目 ---
const GEMINI_API_KEY_AI = 'あなたのAPIキー'; 
const RECIPIENT_EMAIL = 'メールアドレス';
const NEWS_COUNT_AI = 5; // AIニュースは5件程度が読みやすいです
// ----------------

function sendAINews() {
  const cleanKey = GEMINI_API_KEY_AI.trim();
  const url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=' + cleanKey;
  const today = Utilities.formatDate(new Date(), 'JST', 'yyyy年M月d日');

  const prompt = `
  今日は ${today} です。Google検索を使って、世界の「AI(人工知能)業界」の最新ニュースを${NEWS_COUNT_AI}件探してください。
  
  【ターゲット】
  - OpenAI, Google, NVIDIA, Anthropicなどの主要企業の動向
  - 日本国内のビジネス向けAI活用事例
  - Web制作やプログラミングに役立つ新しいAIツールの登場
  
  【出力ルール】
  挨拶不要。以下のJSON形式のみ出力。
  [{"title":"...","url":"...","summary":"...","source":"..."}]
  `;

  const payload = {
    "contents": [{ "parts": [{ "text": prompt }] }],
    "tools": [{ "google_search": {} }],
    "generationConfig": { "temperature": 0.5 }
  };

  const options = { "method":"post", "contentType":"application/json", "payload":JSON.stringify(payload), "muteHttpExceptions":true };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const aiResponseText = JSON.parse(response.getContentText()).candidates[0].content.parts[0].text.replace(/```json/g, "").replace(/```/g, "").trim();
    const newsData = JSON.parse(aiResponseText);

    let htmlList = '';
    newsData.forEach(item => {
      htmlList += `<li style="margin-bottom:20px;"><a href="${item.url}" style="color:#1a73e8; font-weight:bold;">${item.title}</a><br><span style="font-size:14px; color:#555;">${item.summary}</span></li>`;
    });

    MailApp.sendEmail({
      to: RECIPIENT_EMAIL,
      subject: `【AIトレンド】${today}の最新ニュース`,
      htmlBody: `<div style="font-family:sans-serif;"><h2>🤖 本日のAIトピックス</h2><ul>${htmlList}</ul></div>`
    });
    console.log("AIニュース送信完了");
  } catch (e) { console.error("エラー: " + e.toString()); }
}

ワンポイントアドバイス

コード生成でよく起きていたエラーは、Geminiのバージョン指定が原因でした。 AIの回答が古いバージョン(1.5系、2.0系)に基づいたコードを出してくるのですが、1.5では動かず、2.0も不安定だったため、現在は gemini-2.5-flash で固定しています。

AIに頼んでも解決しなかったので、自力で利用可能なバージョンを調べて指定することにしました。参考に、バージョンの確認に使用したスクリプトを載せておきます。新規プロジェクトで試してみてください。

function listAvailableModels() {
  const API_KEY = 'あなたのAPIキーをここに貼り付け';
  const url = `https://generativelanguage.googleapis.com/v1beta/models?key=${API_KEY}`;
  
  try {
    const response = UrlFetchApp.fetch(url);
    const json = JSON.parse(response.getContentText());
    
    console.log("--- 利用可能なモデル一覧 ---");
    json.models.forEach(model => {
      // モデル名と、そのモデルができること(generateContentなど)を表示
      if (model.supportedGenerationMethods.includes("generateContent")) {
        console.log("モデル名: " + model.name);
        console.log("表示名: " + model.displayName);
        console.log("----------------------------");
      }
    });
  } catch (e) {
    console.error("エラーが発生しました: " + e.toString());
  }
}

コードを保存したら、最後にトリガーを設定します。これで自動化が完了します。


⏰ 毎日自動で配信するためのトリガー設定手順

GASのエディタ画面から、以下の手順で設定を進めてください。

1. トリガー画面を開く

画面左側にあるメニューから、**時計のようなアイコン(トリガー)**をクリックします。

2. トリガーを追加する

画面右下にある青色のボタン**「+ トリガーを追加」**をクリックしてください。

3. 自動実行のスケジュールを設定する

設定画面が開くので、以下のように項目を選択してください。ここが「いつ実行するか」を決める心臓部です。

項目設定値
実行する関数を選択sendAINews
実行するデプロイを選択Head
イベントのソースを選択「時間主導型」
時間ベースのトリガーのタイプを選択「日付ベースのタイマー」
時刻を選択「午前7時〜8時」 (お好みの時間でOK)

4. 保存と承認(重要!)

「保存」を押すと、Googleアカウントへのアクセス許可を求めるポップアップが表示されることがあります。

  1. 自分のアカウントを選択します。
  2. 「このアプリは Google で確認されていません」という警告が出た場合は、左下の**「詳細」をクリックし、「(プロジェクト名)に移動」**を選択してください。
  3. 最後に**「許可」**をクリックすれば設定完了です!
[!TIP]

「確認されていません」という警告が出る理由

自分で作ったプログラムを自分だけで使うためのものなので、Googleの公式審査を通っていないため表示されます。自分自身のプログラムなので、安心して進めて大丈夫です。


これで、毎日指定した時間にあなたのメールボックスへ最新のAIニュースが届くようになります。

以下は未検証ですが参考にしてください

クリックすると表示されます

🔍 プロンプト書き換えテンプレート

1. プログラミング・技術トレンド(エンジニア向け)

Web開発や新しい技術スタックに興味がある場合におすすめです。

JavaScript

  const prompt = `
  今日は ${today} です。Google検索を使って、最新の「Web開発・プログラミング」に関するニュースを${NEWS_COUNT_AI}件探してください。
  
  【ターゲット】
  - TypeScript, React, Next.js, Pythonなどの主要言語・フレームワークのアップデート
  - GitHubで話題のリポジトリや、便利な開発ツールのリリース情報
  - エンジニアの生産性向上に役立つTips
  
  【出力ルール】
  挨拶不要。以下のJSON形式のみ出力。
  [{"title":"...","url":"...","summary":"...","source":"..."}]
  `;

2. 経済・資産運用(ビジネスマン・投資家向け)

市場の動きをサクッと把握したい場合に便利です。

JavaScript

  const prompt = `
  今日は ${today} です。Google検索を使って、最新の「米国株・日本株・仮想通貨」に関するニュースを${NEWS_COUNT_AI}件探してください。
  
  【ターゲット】
  - 日米の主要指数(S&P500, 日経平均)の動向と要因
  - 注目企業の決算発表や新事業のニュース
  - 為替やFRBなどの金融政策に関する重要トピック
  
  【出力ルール】
  挨拶不要。以下のJSON形式のみ出力。
  [{"title":"...","url":"...","summary":"...","source":"..."}]
  `;

3. 推し活・エンタメ情報(趣味全般)

特定のゲーム、アニメ、アーティストなどの情報を逃したくない場合です。

JavaScript

  const prompt = `
  今日は ${today} です。Google検索を使って、「(ここに好きな作品名やアーティスト名を入れる)」に関する最新情報を${NEWS_COUNT_AI}件探してください。
  
  【ターゲット】
  - 公式サイトの発表、イベント開催情報
  - グッズの発売日やコラボカフェの情報
  - SNSやメディアで話題になっているトピック
  
  【出力ルール】
  挨拶不要。以下のJSON形式のみ出力。
  [{"title":"...","url":"...","summary":"...","source":"..."}]
  `;

💡 カスタマイズのポイント

  • キーワードを具体的にする: 「AI」よりも「生成AIの実用事例」など、絞り込むほど精度が上がります。
  • 「ターゲット」を調整する: Geminiに「どんな視点でニュースを選んでほしいか」を箇条書きで伝えると、より自分好みの要約になります。
  • JSONのルールを守る: 最後の 【出力ルール】 の部分は絶対に変更しないでください。ここを変えてしまうと、メールを送るプログラムがエラーを起こして止まってしまいます。

[!NOTE] もしニュースの件数を増やしたい(または減らしたい)場合は、コードの最初の方にある const NEWS_COUNT_AI = 5; の数字を好きな数に変更してください。

🎨 デザイン案1:清潔感のある「カードスタイル」

ニュース1件ずつを白い枠線で囲み、背景を薄いグレーにすることで、記事の区切りを分かりやすくします。

書き換え箇所(let htmlList = ''; 以降を差し替え)

JavaScript

    let htmlList = '';
    newsData.forEach(item => {
      // カード型のデザイン
      htmlList += `
        <div style="background-color: #ffffff; border: 1px solid #e0e0e0; border-radius: 8px; padding: 15px; margin-bottom: 15px; box-shadow: 0 2px 4px rgba(0,0,0,0.05);">
          <div style="font-size: 12px; color: #666; margin-bottom: 5px;">📍 ${item.source || '最新ニュース'}</div>
          <a href="${item.url}" style="color: #1a73e8; font-weight: bold; font-size: 18px; text-decoration: none;">${item.title}</a>
          <p style="font-size: 14px; color: #333; line-height: 1.6; margin-top: 10px;">${item.summary}</p>
        </div>`;
    });

    MailApp.sendEmail({
      to: RECIPIENT_EMAIL,
      subject: `【AIトレンド】${today}の最新ニュース`,
      htmlBody: `
        <div style="background-color: #f9f9f9; padding: 20px; font-family: 'Helvetica Neue', Arial, sans-serif;">
          <h2 style="color: #333; border-left: 5px solid #1a73e8; padding-left: 15px; margin-bottom: 20px;">🤖 本日の注目トピックス</h2>
          ${htmlList}
          <div style="text-align: center; font-size: 12px; color: #999; margin-top: 20px;">
            このメールは Gemini API を使用して自動生成されています。
          </div>
        </div>`
    });

🌑 デザイン案2:エンジニアライクな「ダークモード」

目に優しく、技術系ニュースにぴったりのクールなデザインです。

書き換え箇所(let htmlList = ''; 以降を差し替え)

JavaScript

    let htmlList = '';
    newsData.forEach(item => {
      htmlList += `
        <div style="border-bottom: 1px solid #444; padding: 15px 0;">
          <a href="${item.url}" style="color: #8ab4f8; font-weight: bold; font-size: 16px; text-decoration: none;">🚀 ${item.title}</a>
          <p style="font-size: 14px; color: #bdc1c6; line-height: 1.5;">${item.summary}</p>
        </div>`;
    });

    MailApp.sendEmail({
      to: RECIPIENT_EMAIL,
      subject: `【TECH REPORT】${today}`,
      htmlBody: `
        <div style="background-color: #202124; color: #e8eaed; padding: 30px; font-family: 'Courier New', monospace;">
          <h1 style="color: #8ab4f8; font-size: 20px; border-bottom: 2px solid #8ab4f8; padding-bottom: 10px;">> UPDATE_RECEIVED: ${today}</h1>
          ${htmlList}
        </div>`
    });

💡 デザイン調整のコツ

  • 絵文字を活用する: <h2>タグの横に 🤖🚀 を入れるだけで、一気に「ツールっぽさ」が出て愛着がわきます。
  • リンクを大きくする: スマホで読む場合、リンク(<a>タグ)が小さいと押しにくいので、font-size: 18px; くらいにするのがおすすめです。
  • 余白(padding)を作る: div タグに padding を設定すると、文字が端に寄らずに読みやすくなります。

[!IMPORTANT] 注意点 メールのデザインを変更した後は、一度GASの「実行」ボタンを押して自分にテストメールを送り、実際の見え方を確認してみてください。

📝 プロンプトの改良

コード内の const prompt = ... の部分を以下のように書き換えてください。Geminiに対して「箇条書きで、3項目でまとめて」と明確に指示を出します。

JavaScript

  const prompt = `
  今日は ${today} です。Google検索を使って、最新のAI業界ニュースを${NEWS_COUNT_AI}件探してください。
  
  【ターゲット】
  - OpenAI, Google, NVIDIA, Anthropicなどの主要企業の動向
  - 日本国内のビジネス向けAI活用事例
  - 新しいAIツールの登場
  
  【出力ルール】
  1. 挨拶不要。以下のJSON形式のみ出力すること。
  2. "summary" フィールドの内容は、必ず「・」から始まる3行の箇条書きにしてください。
  3. 要約は具体的かつ簡潔に。
  
  [{"title":"...","url":"...","summary":"・要点1\n・要点2\n・要点3","source":"..."}]
  `;

🛠️ プログラム側の小さな調整

Geminiが作成した「箇条書き(改行)」をメールの中で正しく表示させるために、HTMLメールを作成する部分(htmlList += ...)を少しだけ修正します。

.replace(/\n/g, '<br>') という一文を追加することで、Geminiが作った改行をメール上の改行に変換します。

修正後の forEach 部分

JavaScript

    newsData.forEach(item => {
      // summary内の改行コードをHTMLの改行コード <br> に変換します
      const summaryWithBr = item.summary.replace(/\n/g, '<br>');

      htmlList += `
        <li style="margin-bottom:25px;">
          <a href="${item.url}" style="color:#1a73e8; font-weight:bold; font-size:16px;">${item.title}</a><br>
          <div style="font-size:14px; color:#444; margin-top:8px; line-height:1.6; background-color:#f8f9fa; padding:10px; border-radius:5px;">
            ${summaryWithBr}
          </div>
        </li>`;
    });

✅ 変更後のイメージ

届くメールはこのような感じになります。

🤖 本日のAIトピックス

1. OpenAIが新しい検索機能を発表 ・従来の検索エンジンに対抗するSearchGPTを統合 ・リアルタイムのウェブ情報から回答を生成 ・現在は特定のユーザー向けにベータ版を展開中 [リンク...]


💡 ここまでで「自分専用ニュースレター」は完成です!

お疲れ様でした!これで「自動で」「安く」「自分好みの見た目と内容で」ニュースが届く仕組みが出来上がりました。

🛠️ エラー通知機能の追加方法

現在のコードの最後にある catch (e) { ... } の部分を少し書き換えるだけです。

修正後の catch ブロック

JavaScript

  } catch (e) {
    // ログに記録する
    console.error("エラーが発生しました: " + e.toString());

    // 自分にエラー報告メールを送る
    MailApp.sendEmail({
      to: RECIPIENT_EMAIL,
      subject: "⚠️【GASエラー通知】ニュース配信に失敗しました",
      body: `以下のエラーが発生したため、ニュースの送信ができませんでした。\n\nエラー内容:\n${e.toString()}`
    });
  }
}

🔎 エラーが起きた時の確認方法

もしエラーメールが届いたら、以下の手順で原因を詳しく調べることができます。

  1. Google Apps Script のプロジェクトを開きます。
  2. 左側のメニューから 「実行数」(三本線のアイコン)をクリックします。
  3. 「失敗」と表示されている実行記録をクリックすると、どの部分でエラーが出たか(プロンプトが長すぎた、APIキーが間違っているなど)の詳細が見られます。

🚀 これで「最強の自作ニュースレター」の完成です!

ここまでのカスタマイズで、以下のような高機能な仕組みが出来上がりました。

  • 自動配信: 毎朝決まった時間に。
  • 最新AI検索: Geminiがネットから最新情報を収集。
  • 時短要約: 3行の箇条書きでパッと読める。
  • デザイン: スマホで読みやすいHTML形式。
  • 自己診断: エラーが起きたらすぐに通知。

自分で一から作ると、愛着もわきますし、何より**月額数千円する有料のニュースサービスに近い機能が「ほぼ無料」**で手に入るのが最大の魅力ですね。