見出し画像

AI要約!瞬速回覧 GAS + LINE🟩⬜🟩で届く自治会情報のAutomation化

自治会回覧をLINE公式+Google drive☁️で電子運用中です。さらなるズボラに向けGoogle driveに保存されたpdfをAI(Cloud Vision)で要約、LINE配信する自動化システムの作成過程についてまとめておきます。
Google spreadsheetに要約保存、日時判定し自動配信。


現状

紙回覧を電子化できたことで、会員の皆さんの労力は削減されました。また配信者の作業も月に1〜2回で大きな負担ではありませんが、まだ手作業が必要な工程が残されています。

課題

回覧物には日付情報があり、その日付に応じたタイムリーな配信が求められますが、作業依頼があれば、まとめて、月に1回作業しているといった感じです。現在、「PDF内容確認、要約、LINE公式アカウントでの配信設定」といった一連の手作業が残っています。

自動化への提案

アプローチ

PDFがアップロードされてから配信するまでの工程を自動化。具体的には、Googleドライブの指定フォルダを定期的にチェックし、新規または更新されたファイルを自動的に検出するシステムを構築します。

耳慣れないものはAIで調べながら方針整理。


PDFファイルの自動処理とLINE配信を行う Google Apps Script アプリケーション。
主な機能を3つのフローで説明:

1.初期設定フロー
 OAuth認証設定:Google Cloud ServicesのAPIを使用するための認証
 フォルダID設定:監視対象のGoogleドライブフォルダを指定
 PDF監視設定:自動または手動での処理開始設定

ーーー以下自動化される部分ーーー

2.PDF処理フロー
 PDFファイルの監視と取得
 新規/更新されたPDFファイルを検出
 ファイル名を規定フォーマットに更新
 テキスト抽出と要約
 Google Cloud Vision APIでPDFからテキストを抽出
 Gemini APIで抽出テキストを要約
 要約結果をスプレッドシートに保存

3.LINE配信フロー
 トリガー設定
 スプレッドシートの各要約に対して配信スケジュールを設定
 指定された日時に自動配信するトリガーを作成
 メッセージ配信
 設定された時刻に要約をLINEで配信
 配信状態の管理と更新

主な特徴:
 Google Cloud ServicesのAI/ML APIの活用
 スプレッドシートベースの管理インターフェース
 LINE公式アカウントとの連携
 エラーハンドリングとログ管理

このシステムにより、PDFドキュメントの内容を効率的に要約し、適切なタイミングでLINEを通じて
配信することが可能になります。

サンプルpdfとその要約結果です。(これをLINEでテキスト配信する。)

🌈👮‍♂️年末防犯パトロール!
🕒 重要日付:令和6年12月25日〜27日
📍 注目ポイント:地域ぐるみで安心安全
要約:
年末年始の防犯パトロールを実施!12/25(水)~27(金)の夜8時~30分程度。各丁目で集合してパトロールします。カイロやライトも用意!雨天時は中止連絡あり。
#防犯パトロール #地域安全

/gemini-1.5-flashでの要約_LINE配信用

pdf見て、このようなコメント作成するのもAIサイトに貼り付ければすぐとは言え、手作業で5枚、10枚となると面倒な時もあります。

Google Apps Scriptを使った一連の流れを組むことで、PDFの処理から要約、情報記録、配信設定まで効率よく行うことが可能になります。

 作成したスプレッドシートは以下のようになります。メニューバーに作業項目を追加。

spreadsheet

拡張性

Google Drive保存後にAPIでLINEやSNSに送信することができれば、Twitter,FB,Insta,LinkedIn 他、最後の送信部分を工夫するだけで色々応用できると思います。

実際には仕向先によって文字数などプロンプト調整が必要ですが、同じシステムで使うなら、OpenAIのAssistant IDなどでSNS別にコントロールすると投稿内容もカスタムできます。

自治会に留まらず、他の組織でも情報共有モデルとして拡張可能かと思います。

なお、実行に至るまでには、App Scriptのプロジェクト設定_スクリプロパティに設定しないと動きません。

Spread sheet App Script プロジェクト設定画面

手順

# システム初期設定手順

## 1. Google Cloud Platform (GCP) の設定

- [ ] 新規プロジェクト作成
- [ ] 以下の API を有効化:
  - Cloud Vision API
  - Cloud Storage API
  - Gemini API
- [ ] OAuth 同意画面の設定
  - アプリ名:PDF 自動要約配信
  - ユーザーサポートメール:管理者メール
  - 承認済みドメイン:script.google.com
- [ ] 認証情報の作成
  - OAuth 2.0 クライアント ID の作成
  - クライアント ID とシークレットの保存

## 2. Google Cloud Storage (GCS) の設定

- [ ] バケットの作成
  - 名前:一意の名前を設定
  - リージョン:asia-northeast1(東京)
  - アクセス制御:均一
- [ ] アクセス権限の設定
  - OAuth 認証ユーザーにバケットへのアクセス権限を付与
  - 必要な権限:Storage Object Viewer, Storage Object Creator

## 3. LINE Developers の設定

- [ ] プロバイダー作成
- [ ] Messaging API チャネルの作成
- [ ] チャネルアクセストークンの発行(長期)

## 4. Google Apps Script の設定

- [ ] スクリプトプロパティの設定: 
SCRIPT_ID
CLIENT_ID
CLIENT_SECRET
LINE_ACCESS_TOKEN
FOLDER_ID
BUCKET_NAME `
- [ ] 必要なスコープの承認
- [ ] デプロイの設定(ウェブアプリケーション)

## 5. 監視フォルダの設定

- [ ] Google ドライブにフォルダ作成
- [ ] フォルダ ID の取得
- [ ] アクセス権限の設定
  - スクリプトに対する閲覧権限
  - PDF アップロード用の共有設定

コツコツAIに尋ねました。

コード

以下のスプレッドシートをファイル ->コピーを作成し、ご確認ください。

構成は以下のようになっています。

├── api/
│ ├── geminiAPI.js # Gemini API クライアント
│ └── visionAPI.js # Vision API クライアント
├── auth/
│ └── Oauth.js # OAuth 認証処理
├── core/
│ ├── PDFProcessor.js # PDF メイン処理
│ └── SheetWriter.js # スプレッドシート書き込み
├── triggers/
│ ├── MessageTrigger.js # LINE 配信トリガー
│ └── onOpen.js # メニュー初期化
├── utils/
│ └── errorHandler.js # エラー処理


シーケンス

コードの一部です。(要約パート)

class GeminiAPI {
  constructor(accessToken) {
    this.accessToken = accessToken;
    this.apiUrl = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent';
  }

  async summarize(text) {
    const sanitizedText = this._sanitizeText(text);
    const prompt = this._createPrompt(sanitizedText);
    
    try {
      const response = await this._callGeminiAPI(prompt);
      if (response.getResponseCode() !== 200) {
        Logger.log(`API request failed with status code: ${response.getResponseCode()}`);
        return null;
      }

      const data = JSON.parse(response.getContentText());
      if (data.error) {
        Logger.log('Error from Generative Language API: ' + JSON.stringify(data.error));
        return null;
      }

      const summary = data.candidates[0].content.parts[0].text;
      return summary.replace(/```/g, '').trim();

    } catch (error) {
      Logger.log('Error during Gemini API call: ' + error);
      return null;
    }
  }

  _sanitizeText(text) {
    return text
      .replace(/\\/g, '\\\\')
      .replace(/"/g, '\\"')
      .replace(/\n/g, ' ')
      .replace(/\r/g, '')
      .trim();
  }

  _createPrompt(sanitizedText) {
    return {
      contents: [{
        parts: [{
          text: `
              # AIボット設定プロンプト:LINE公式情報要約bot

              ## 基本設定
              - 目的:ユーザーに簡潔で魅力的な情報を提供
              - スタイル:親しみやすく、明るく、簡潔な日本語
              - 対象:一般ユーザー、地域に根ざす50-70代の自治会員

              ## 入力テキスト処理ガイドライン
              1. 以下のテキストを分析:
              \`\`\`
              ${sanitizedText}
              \`\`\`

              2. 出力フォーマットを厳守

              ## 出力要件
              ### タイトル
              - 絵文字2つ必須
              - 20文字以内
              - 本質的でキャッチーな表現

              ### 要約セクション
              - 50文字以内
              - 最重要ポイントを抽出
              - 読み手の興味を即座に引く内容

              ### キーデータ
              - 重要日の特定
              - 配信日時を確実に計算(重要日付から2週間前の土曜日であること)
              - 形式は(yyyy-mm-dd)
              - 重要日付と配信日時は異なる
              - トレンドワード2つ抽出
              - ハッシュタグ形式で提示
              
              ## 最終出力フォーマット
              \`\`\`
              🗻📊 [タイトル]

              🕒 重要日付:[日付]
              📍 注目ポイント:[簡潔なポイント]
              📅 配信日時:[日時]
              

              要約:
              [85文字以内の本質的な要約]

              #トレンドワード1 #トレンドワード2
              \`\`\`
          `
        }]
      }]
    };
  }

  _callGeminiAPI(payload) {
    const options = {
      'method': 'POST',
      'contentType': 'application/json',
      'headers': {
        'Authorization': `Bearer ${this.accessToken}`,
      },
      'payload': JSON.stringify(payload),
    };

    return UrlFetchApp.fetch(this.apiUrl, options);
  }
} 

費用

開発過程で200ファイルほど処理したかな。¥29- のAPI費用がかかってました。Cloud vision API(¥27-) 

最後に


本システム。自PCでpython + cron で稼働させていたのですが、自治会の他のメンバーにGoogleアカウントで引き継ぎしたいとの思いから作成。多分誰も引き継げない。(なので自動化した。)
Spreadsheetを介在させるとデータの書式設定変更などですぐにエラーになったり。ログ残すのに、コード量が多くなったり。色々煩雑なものになってしまいました。

自治会むけの電子回覧のDIY コード。特にクレームなどはありません。いや、役所がこれやってくれれば、自治会の仕事も楽になるのに。

どうしても動かしてみたいという稀有な方。”クリエイターに問い合わせ”から連絡ください。(私もAIに問い合わせるだけですけど、、)

最後までお読みくださりありがとうございました。皆さんの業務改善のお役に立てば何よりです。


いいなと思ったら応援しよう!