自己紹介
縁あってエンジニアの方と近い距離でお仕事をしています。
自身の学びのためにも作成している記事です。
主観も織り混ざっています。
応用編や、様々な利用シーンなど、ご意見大歓迎です。
IT系ニュースを毎朝自分宛に配信する仕組みを作る
Google Apps Script(GAS)とGemini APIを使って自動化を試してみました。
Geminiに質問すると所要時間は約10分程度でサクッとできるということだったので、取りかかってみたところ、次々とエラーが発生し、トライアンドエラーの繰り返しで、結果30分程時間を要しました。
今回は、非エンジニアがLLMを使って自動化を試みたリアルな失敗談と、対応したことで感じたことを書きたいと思います。
叶えたいこと
- 毎日決まった時間に、最新のITトレンド(Qiitaの「Claude Code」関連記事や、各メディアのビジネスITニュース)を自動巡回
- 収集したデータをGemini API(gemini-2.5-flash)に渡し、ビジネスパーソン向けに3行程度で要約してもらう
- 件名を
【DailyITNews】[本日の一言まとめ]にして、毎朝Gmailに自動配信する
各種SNSやトレンドなどの自動配信・通知はあるものの、自分好みの配信内容にしてみたいと思い試してみることにしました。
手順
Geminiに自動配信の仕組みを聞いて出てきた手順は以下
1.Gemini API Keyを取得する
- Google AI Studioにアクセスし数クリックでAPI Keyを発行
2.通知先の準備をする - 今回はプライベートのgmailに送付
3.Google Apps Script(GAS)にコードを貼り付け - Google ドライブからGoogle Apps Scriptを開き、Geminiに書いてもらったプログラムのコードを貼り付け
4.トリガー(タイマー)設定をする - GASの画面上にある時計マーク(トリガー)をクリックし、「イベントのソース:時間主導型」「時刻:特定の日時(毎日朝7時〜8時)」のように設定
何も問題が起こらなければ、ここまでの作業は10分程度で完了できると想定して試してみました。
実際に直面したエラー
手順1.2.は説明通りに進めると問題なく完了できました。
このまま問題なく進められるかなと思ったのですが、手順3.で足止めとなりました…。
①ニュースサイト側の「アクセス拒否」とXMLパースエラー
最初に作成したコードは、「RSSフィードをGASの XmlService で読み込む」というものでした。しかし、実行してみると以下のエラーが発生…。
情報フィード取得エラー: Exception: Caught SAXException... The element type "link" must be terminated by the matching end-tag "</link>".
Request failed for [https://news.google.com](https://news.google.com) returned code 400.
ニュースサイト側のデータ構造(XML)の微細なバグにGASが耐えられなかったり、GASからの短時間での連続アクセスが「BOTによる不審な通信」とみなされ、サーバー側からセキュリティブロック(400エラー)が出ました。
繰り返すこと3回…
- XMLの書き方が多少バグっていてもエラーで止まらず文字だけを「正規表現」という技術で抜き出す
- GoogleニュースURLの正常化
- GoogleニュースのRSSフィードは、GASの短時間での連続アクセスに対して、一時的にセキュリティブロック(閲覧制限)をかける仕様になっているとのこと
4回目…Geminiさんに確認していよいよ実行でいけると思いきや…
ニュースデータが一切取得できませんでした
再び繰り返すこと3回
- Googleニュースを諦めて削除
- 別のメディアURLを追加
- エラー発生しURLの修正
- 文字の切り出し処理(正規表現)の不具合の調整
以下は実行の後に表示されたエラー達…
Geminiからの応答が空でした。APIキー(GEMINI_API_KEY)が正しく貼り付けられているか、前後のダブルクォーテーションを消していないか確認してください。
sendDailyItTrend を実行しようとしましたが、プロジェクトを保存できませんでした。
修正毎にフィードバックをGeminiに投稿していたのですが、繰り返しすぎてGeminiから出てきたコードの一部が誤って二重に重複されてしまったとのこと…。
再度、調整してようやく以下の表示が出てきました…。
メール送信が完了しました!大成功です!
後から知ったのですが、XMLやHTMLを正規表現で無理やり処理しようとするのはエンジニア界隈ではNGだそうで、見事にその罠にハマりました…。
②Geminiのハルシネーションの洗礼
「外部サイトへの通信が弾かれるなら、Geminiにホットなトレンドをピックアップしてもらって、記事としてまとめる方向にしよう」
そう考えて調整したところ、一見できていそうなメール配信が届きました。
しかし、本文をよく見ると…
- タイトル: hogehoge〜(タイトルは正常に表示)
- URL: https://qiita.com/claude_dev/items/xxxxxxxxxxxxxxxxx
それらしいタイトルと架空のURLを自動生成させてしまう結果に…。
この時点で何でこんなことになったのか原因が分かっていませんでした。
③Geminiがフリーズ
架空の内容を生成するというコードになっていたため、Qiitaを正式な情報収集元として再度、Geminiでコードを生成。ようやくうまくいくかと思ったら今度は以下が表示されました…。
Geminiからの応答が空でした。
原因は、Qiitaから取得した生のデータ(特殊な記号、文字列、改行など)がプロンプトにそのまま混入したことで、APIに送るデータの形(JSON構文)が壊れてしまい、リクエスト自体がエラー(パースエラー)になっていたようです。
最終結果(改善点)
度重なるエラーを経て、最終的には以下の構造に至りました。
URLの維持や文字の結合など、ロジックが命の部分は100%確実な「GAS(プログラム)」で実行、ツールや技術の背景解説など、文脈が必要な部分だけを「Gemini(AI)」に任せる方法です
最終的なシステム構造
1.GAS:Qiita APIを叩き、今朝のリアルな最新記事の「タイトル」と「URL」を確実に配列
2.Gemini:「Claude Codeの最新動向に関する、汎用的な解説文(要約)」だけを綺麗に5パターン作成
3.GAS:取得した本物のURLと、Geminiが作った解説文をHTMLの<a>でマージする
4.HTML形式でGmailを送信し、クリック可能なリンク付き記事の完成
5.毎日決まった時間に配信
受信したメール画面の結果はこちら↓
改善点
1.URLや実在する数字などの「正確性」が求められる処理は、プログラム(APIなど)で取得
2.Webスクレイピングしたテキストをそのままプロンプトとして使用すると、予期せぬ文字や記号でフィルターに、引っかかりデータ取得ができない
3.小さく役割を分ける設計(ステップを小分けにして、デバッグの負荷軽減)
それっぽさが過ちにつながる…頼りすぎない自分で考える設計力を持つこと
最初は10分で終わるつもりが、気づけば30分の時間を要しました。
根本の問題は、自分のスキル範疇外ということ何となく試してみようとライトな気持ちでプロンプトを作成してしまったことです。
それっぽさを演出・作ることは可能であっても、物事の原理を理解しないこと、AIを自身の理解を超える使い方をすると何が正しくて・正しくないのかの判断すらできない不確実性の高いことに時間を費やすことになります。
一方で、自分一人で対応していたら、それこそ今以上の時間を要して挫折してしまっていたかもしれません。Geminiにエラーを投げて一緒に解決策を探れたからこそ、30分という時間で軌道修正できたのはAI時代の恩恵でもあります。
久々に何気なく使ってみるという体験をしようとしたところから、沼から足が抜けない体験をしました。
日頃の業務も同様にコンテキスト・プロンプトが後の工程を左右することになるので、スピード感が求められる時代だからこそ、この部分は丁寧に向き合っていきたいものです。
