23
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIがニュースを集めて要約してメールしてくれる仕組みを作った(Googleアラート × Gemini × GAS)

23
Posted at

はじめに

最近、Googleアラートを知り、情報収集に役立つのでは!?と思っています。

Googleアラート(Google Alerts)は、指定したキーワードに関する最新情報がネット上で公開・更新された際に、メールで自動通知を受け取れるGoogleの無料情報収集ツールです。

しかし、定期的に検索した結果を提供してくれるのは良いのですが...

  • Gmailではなく別のメールに送りたい :envelope_with_arrow:
  • 検索した結果を要約してほしい :white_check_mark:

と思いました。
そこで、Googleアラート で気になる情報を自動収集して、さらに Gemini API を使ってその情報を要約してもらっちゃいましょう!

すべて無料でできます!

仕組み

以下の構成となります。

  • 📡 GoogleアラートをRSSで取得
  • 🔁 GASでRSSを定期取得
  • 🤖 Gemini APIでニュースを自動要約
  • 📬 メールに毎日配信

どうやって作ったの?

3つの手順でできます。

:one: Googleアラート設定
:two: Gemini API取得
:three: Google App Script作成

それでは、詳細をみていきましょう!

:one: Googleアラート設定

Googleアラートを設定します。

image.png

「アラートを作成」で気になるキーワードを入力します。
例えば「Claude」と入力します。
「オプションを表示」でオプションを選択します。

image.png

  • 頻度:(未選択)
    「配信先」で「RSSフィード」を選択すると非アクティブになります。
  • ソース:ニュース
    ニュース関連で情報収集するため、ニュースを選択します。
  • 件数:上位の結果のみ
    関連の強い情報のみ収集したいため、上位の結果のみを選択します。
  • 配信先:RSSフィード
    今回は検索した結果をGemini APIで要約してもらいたいので、情報を定型フォーマットで取得できるRSSフィードを選択します。

RSS(Rich Site Summary) は、Webサイトの更新情報を効率的に収集するためのXMLベースの技術です。ブログやニュースサイトのタイトル、要約、URLなどの最新情報を自動配信します。

扇形のRSSアイコンをクリックしてURLを控えます。
後の工程のGoogle App Scriptで使用します。

image.png

これでGoogleアラートの設定はおしまいです。

配信先にRSSフィードではなく、Gmailのメールアドレスを設定すれば、定期的に検索結果の情報がGmailに届くようになります!

:two: Gemini API取得

Google AI Studio で Gemini API を取得します。

Gemini API とは、Googleが提供する高性能な生成AIモデル「Gemini」の機能を、自社のアプリケーションやシステムに組み込むことができます。開発者はこのAPIを通じて、テキスト生成、画像理解、要約、コード補完といったGeminiの高度なAI機能に活用できます。利用にはAPIキーが必要で、通常は使った分だけ料金が発生する従量課金制ですが、無料枠も提供されています。

今回、Gemini APIを使用する理由としては 無料枠 があるからです。
情報の要約程度であれば 無料枠 の範囲で十分です。

画面左下の「Get API key」をクリックします。

image.png

画面右側の「APIキーを作成」でAPIキーを取得します。
こちらで作成したAPIキーを次のGoogle App Scriptで使用します。

image.png

APIキーは他人に知られないように厳重に管理してください。

これでGemini APIの取得はおしまいです。

:three: Google App Script作成

Google App Script(GAS)を作成します。

Google Apps Script(GAS) は、Googleが提供するJavaScriptベースのクラウド型スクリプト環境です。ブラウザ上で動作するため特別なインストールは不要で、定期的なデータ処理や外部サービス連携も無料で構築可能です。

「新しいプロジェクト」でプロジェクトを作成します。
プロジェクトという単位でScriptを管理します。

image.png

例えば「GoogleAlerts」というプロジェクトを作成します。

image.png

スクリプトを作成します。
ポイントとなるコードを解説します。

const RSS_URL = "XXX";
const GEMINI_API_KEY = "XXX";
const EMAIL = "XXX";
  • RSS_URL には、 :one: で控えた RSS の URL を指定します。
  • GEMINI_API_KEY には、 :two: で作成した API Key を指定します。
  • EMAIL には、通知したいメールアドレスを指定します。
  // ★ 最新5件だけ処理(必要なら変更OK)
  const entries = root.getChildren("entry", ns).slice(0, 5);

取得したい検索結果の最新の5件だけを指定します。
件数を多くし過ぎると無料枠でのAPI使用上限に引っかかる可能性があります。

  // ===== まとめて Gemini に渡すテキストを作成 =====
  let combinedText = "以下の複数の記事を読み、記事タイトルごとに3〜5個の箇条書きで要約してください。\n\n";

  entries.forEach(entry => {
    const title = entry.getChildText("title", ns);
    const content = entry.getChildText("content", ns);
    const link = entry.getChild("link", ns).getAttribute("href").getValue();

    combinedText += `
■ ${title}
本文: ${stripHtml(content)}
URL: ${link}

`;
  });

Geminiに渡すプロンプトです。
それぞれの記事に対して要約をしてもらうようにします。

// ===== Gemini API 呼び出し(1回だけ) =====
function summarizeWithGemini(text) {
  const url =
    "https://generativelanguage.googleapis.com/v1/models/gemini-2.5-flash:generateContent?key=" +
    GEMINI_API_KEY;

  const payload = {
    contents: [
      {
        parts: [
          {
            text:
              "以下の複数の記事を読み、記事タイトルごとに3〜5個の箇条書きで要約してください。\n\n" +
              text
          }
        ]
      }
    ]
  };

複数の記事をRSSでまとめて取得し、1度のGemini APIの呼び出しで処理します。
こうすることでAPIの使用頻度を抑えます。
(そうしないと1分間の使用上限に引っかかってしまう💦)

モデルはgemini-2.5-flashを使用します。
無料で使用でき、コストパフォーマンスが良いためとなります。

2026/2/8時点で Gemin API を取得すると以下のモデルが使用可能です。

  • Gemini 2.5 Flash
  • Gemini 2.5 Pro
  • Gemini 2.0 Flash
  • Gemini 2.0 Flash 001
  • Gemini 2.0 Flash-Lite 001
  • Gemini 2.0 Flash-Lite
  • Gemini 2.5 Flash-Lite"
  GmailApp.sendEmail(EMAIL, "【Googleアラート(Claude)まとめ】", mailBody);

「【Googleアラート(Claude)まとめ】」という件名で指定したメールアドレス宛にメールを送信します。

これでGoogle App Sriptの作成はおしまいです。

Google App Script 全コード はこちらです。
const RSS_URL = "XXX";
const GEMINI_API_KEY = "XXX";
const EMAIL = "XXX";

function summarizeRSS() {
  const xml = UrlFetchApp.fetch(RSS_URL).getContentText();
  const document = XmlService.parse(xml);
  const root = document.getRootElement(); // <feed>

  const ns = XmlService.getNamespace("http://www.w3.org/2005/Atom");

  // ★ 最新5件だけ処理(必要なら変更OK)
  const entries = root.getChildren("entry", ns).slice(0, 5);

  // ===== まとめて Gemini に渡すテキストを作成 =====
  let combinedText = "以下の複数の記事を読み、記事タイトルごとに3〜5個の箇条書きで要約してください。\n\n";

  entries.forEach(entry => {
    const title = entry.getChildText("title", ns);
    const content = entry.getChildText("content", ns);
    const link = entry.getChild("link", ns).getAttribute("href").getValue();

    combinedText += `
■ ${title}
本文: ${stripHtml(content)}
URL: ${link}

`;
  });

  // ===== 1回だけ Gemini API を呼ぶ =====
  const summaryText = summarizeWithGemini(combinedText);

  // ===== メール送信 =====
  let mailBody = "【Googleアラート(Claude)まとめ】\n\n";
  mailBody += summaryText;

  GmailApp.sendEmail(EMAIL, "【Googleアラート(Claude)まとめ】", mailBody);
}


// ===== HTMLタグ除去 =====
function stripHtml(html) {
  return html
    .replace(/<[^>]+>/g, "")
    .replace(/\s+/g, " ")
    .trim();
}


// ===== Gemini API 呼び出し(1回だけ) =====
function summarizeWithGemini(text) {
  const url =
    "https://generativelanguage.googleapis.com/v1/models/gemini-2.5-flash:generateContent?key=" +
    GEMINI_API_KEY;

  const payload = {
    contents: [
      {
        parts: [
          {
            text:
              "以下の複数の記事を読み、記事タイトルごとに3〜5個の箇条書きで要約してください。\n\n" +
              text
          }
        ]
      }
    ]
  };

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

  const response = UrlFetchApp.fetch(url, options);
  const data = JSON.parse(response.getContentText());

  return data.candidates?.[0]?.content?.parts?.[0]?.text || "要約できませんでした。";
}

最後に左メニューから「トリガー」を作成します。
定期的にGASを実行し、メールを受け取れるようにします。

image.png

トリガーの条件を指定します。
1日1回、決まった時間に実行したいので以下の設定としています。

image.png

  • 実行する関数を選択:summarizeRSS
  • デプロイ時に実行:Head
  • イベントのソースを選択:時間主導型
  • 時間ベースのトリガーのタイプを選択:日付ベースのタイマー
  • 時間を選択:(メールを受信したい時間帯を指定)

:envelope_with_arrow: 実際に受け取ったメール

【Googleアラート(Claude)まとめ】

以下に各記事の要約を箇条書きで示します。

---

**■ AppleがCarPlayにChatGPT・Claude・Geminiを解禁!数ヶ月以内に車内でAI対話が可能に**
*   AppleはCarPlayで、ChatGPT、Claude、Geminiなどのサードパーティ製AIチャットボットアプリの利用を許可する計画を発表しました。
*   iOS 26.4において大規模言語モデルが活用され、CarPlayでのAI機能が実装されます。
*   これにより、数ヶ月以内に車内でAIとの対話が可能になる見込みです。

**■ 自治体AI zevoにて、Claude Opus 4.6 が本日2026年2月6日(金曜日)より利用可能に!新たな ...**
*   自治体向けAIサービス「zevo」に、新たな生成AIモデル「Claude Opus 4.6」が追加されました。
*   「Claude Opus 4.6」は、2026年2月6日より「zevo」で利用開始されています。
*   このサービスはシフトプラス株式会社によって提供されています。

**■ Claudeの新モデル「Opus 4.6」とは?特徴や料金、4.5との違いを徹底解説!**
*   「Claude Opus 4.6」は、高度な推論力と実務レベルのコーディング能力を備えた最新の生成AIモデルです。
*   本記事では、このモデルの特徴、利用料金、旧バージョンである4.5との具体的な違い、およびその使い方が詳細に解説されています。
*   Anthropicが開発した「Opus 4.6」は、AIの多岐にわたる機能性を大きく向上させています。

**■ Anthropic の Claude Opus 4.6 はコーディングとロジックの進歩で AI の新しい標準を設定**
*   人工知能分野の大手企業であるAnthropicが、最新モデル「Claude Opus 4.6」のリリースを発表しました。
*   このモデルは、コーディング能力とロジック(論理的推論)において顕著な進歩を遂げ、AIの新たな標準を確立するとされています。
*   Anthropicは、「Opus 4.6」がこれらの分野での性能を大きく向上させたことを強調しています。

**■ Anthropic の 16 体の Claude AI エージェント、2 週間・2 万ドルで実用的な C コンパイラを構築**
*   Anthropicは、「Claude Opus 4.6」モデルの16個の独立したインスタンスで構成される自律型AI開発チームの実験を実施しました。
*   このAIチームは、わずか2週間という短期間で実用可能なCコンパイラを構築するという驚くべき成果を達成しました。
*   コンパイラ構築にかかった費用は、約2万ドルと報告されています。
*   この実験は、「Claude Opus 4.6」の高度なコーディング能力と、複数AIエージェント間の連携可能性を示しています。

いい感じです :thumbsup:

こんな時どうする?

  • GAS を実行したら code 249 が返ってきた
    これは、Gemini API の利用上限(クォータ)に達したため、API が 429(Too Many Requests)を返しています。時間を空けて再度実行してみてください。

おわりに

  • 毎日のニュースの情報収集を完全に自動化します。
  • Geminiを使って情報を要約するのがポイントです。しかも無料!
  • みなさんもお好きなキーワードで情報収集に役立ててください!
23
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?