🤖

[Dify]Google Search APIで取得した項目をパースしてスプレッドシートに格納するまで

2025/01/15に公開

Google Search APIで取得した項目をパースしてGoogleスプレッドシートに書き込みするまでの流れのメモ

大まかなワークフロー

  1. SearchAPIで検索したいキーワードを入力
  2. GoogleSearchAPIにリクエストを飛ばす
  3. 戻ってきた値をJSON形式にパースする
  4. GASにPOSTしてスプレッドシートに3の情報を書き込む

セットアップ

Custom Search JSON API

https://developers.google.com/custom-search/v1/overview?hl=ja
APIキーを発行する

「キーを取得」ボタンからAPIキーを発行
1日あたり100件のクエリは無料

Custom Search JSON API では、1 日あたり 100 件の検索クエリを無料で利用できます。これを超えて必要な場合は、API Console でbillingをお申し込みいただけます。追加リクエストの料金は、クエリ 1, 000 クエリあたり $5 で、1 日あたり 1 万クエリまでです。

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

スプレッドシートの作成

空のスプレッドシートを作成しAppScriptを選択

AppScriptにコードの貼り付け

GASのスクリプトにPOSTで受け取った値を書き込むコードを挿入(受け取る形式によって書き換えが必要)

function doPost(e) {
  // スプレッドシートとシート1を取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('シート1');

  // シートの最終行を取得
  var lastRow = sheet.getLastRow();

  // POSTデータをパース
  var jsonData = JSON.parse(e.postData.contents);

  // ヘッダーがなければ追加
  if (lastRow === 0) {
    sheet.appendRow(['Title', 'Link', 'Description']);
    lastRow = 1;
  }

  // JSONデータをスプレッドシートに書き込む
  if (jsonData.items) {  // ここを修正
    jsonData.items.forEach(function(item) {
      sheet.appendRow([item.title, item.link, item.description]);
    });
  }

  // レスポンスを返す
  return ContentService.createTextOutput(JSON.stringify({
    status: 'success',
    message: 'Data written to the spreadsheet successfully.'
  })).setMimeType(ContentService.MimeType.JSON);
}

デプロイしてAPIキーを発行する


アクセスできるユーザーは「全員」を選択

発行された「URL」をメモっておく(Difyのセットアップで使います)

Difyのワークフロー設定

開始で検索キーワードを入力

Google Search APIにリクエスト飛ばす

以下のような形でセットアップ
keyに管理画面から取得したAPIキーを入れる

Google Search APIのパラメーターの詳細は以下
https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list?apix=true&hl=ja
q欄には開始時のキーワードを入れる

戻ってきた値をJSON形式にパース処理

実行コード

import json

def main(arg1: str) -> dict:
    try:
        # 文字列をJSONとしてデコード
        response_data = json.loads(arg1)
        
        # itemsが含まれているか確認
        if "items" in response_data:
            # items内の各エントリから必要な要素を抽出
            extracted_items = []
            for item in response_data["items"]:
                # titleとlinkを取得
                title = item.get("title", "")
                link = item.get("link", "")
                
                # pagemap.metatagsからdescriptionを取得(存在する場合のみ)
                pagemap = item.get("pagemap", {})
                metatags = pagemap.get("metatags", [])
                description = metatags[0].get("og:description", "") if metatags else ""
                
                # 抽出したデータをリストに追加
                extracted_items.append({
                    "title": title,
                    "link": link,
                    "description": description
                })
            
            # 結果を辞書形式で返す
            return {"result": {"items": extracted_items}}
        else:
            return {"result": {"error": "No 'items' found in the response"}}
    
    except json.JSONDecodeError as e:
        # JSONデコードエラーの場合のエラーハンドリング
        return {"result": {"error": f"JSONDecodeError: {str(e)}"}}
    except Exception as e:
        # その他のエラーをキャッチ
        return {"result": {"error": f"Unexpected error: {str(e)}"}}

if __name__ == "__main__":
    # Example API response for testing
    api_response_body = '''{
        "items": [
            {
                "title": "Solana: Web3 Infrastructure for Everyone",
                "link": "https://solana.com/",
                "pagemap": {
                    "metatags": [
                        {
                            "og:title": "Solana: Web3 Infrastructure",
                            "og:description": "Bring blockchain to the people."
                        }
                    ]
                }
            },
            {
                "title": "Solana price today, SOL to USD live price, marketcap and chart ...",
                "link": "https://coinmarketcap.com/currencies/solana/",
                "pagemap": {
                    "metatags": [
                        {
                            "og:title": "Solana Price",
                            "og:description": "The live Solana price today."
                        }
                    ]
                }
            }
        ]
    }'''

    # Call the main function and print the result
    result = main(api_response_body)
    print(json.dumps(result, indent=2, ensure_ascii=False))

GASにリクエストしてスプレッドシートに書き込む

GASで発行したリクエストURLをPostのところに貼り付ける

JSON欄で変数選択できなかった場合は以下対応をみてください。
https://zenn.dev/kayato/articles/5043cab7758ee1

参考記事

https://noviq.jp/column/article/how-to-analyze-google-search-results-using-dify
https://note.com/sinya_ai/n/nd90fc1f8b1fb
https://www.youtube.com/watch?v=blO9hKxtnGA
https://www.scuti.jp/blog/make-seo-articles-by-dify-workflow-202406
https://rooter.jp/programming/edit-spreadsheet-with-gas/

Discussion