AIとGASを使ってGoogleマップからおすすめ店舗ベスト10をスプレッドシートに！地図作成も簡単に

これは 「satto | [生成AIエージェント Advent Calendar 2024](https://qiita.com/advent-calendar/2024/satto)」 14日目の記事です。

こんにちは。「学びの探究者」です。普段はnoteで活動しています。

https://note.com/lovely_hawk768

普段は、エンジニアではありません。
そんな私でも「satto」を使えば自分の好きなスキルができちゃうんだーということでサッとご紹介できればと思います。

この記事では、AIとGoogle Apps Script（GAS)、生成AIを組み合わせて、日常で役立つ簡単なスキルを作る方法を紹介します。生成AIを使ったアプリケーション開発に興味がある方や、非エンジニアでも手軽に生成AIを試してみたい方におすすめです。

# スキルの概要
- 目的：Googleマップの店舗情報を効率的に抽出し、スプレッドシートに整理するスキルをAIとGASで実現。
- できること
1\. Googleマップで検索した上位10店舗の情報を取得
2\. スプレッドシートにデータを自動アップロード
3\. フィールド例: 店舗名、住所、緯度、経度、レビュー評価、レビュー数など
- 技術スタック
1\. GoogleマップAPI
2\. Google Apps Script (GAS)
3\. satto

# スプレッドシートの設定方法（GAS)
1\. スプレッドシートの準備：Googleドライブで新しいスプレッドシートを作成します。
「スプレッドシートID」をコピーしておきます。（URLの中の docs.google.com/spreadsheets/d/[ここがID]）
2\. GASエディタを開く：スプレッドシートの「拡張機能」→「Apps Script」をクリックします。
GASエディタが開いたら、新しいプロジェクトとして保存。
3\. スクリプトの記述：
```
function onEdit(e) {
  const spreadsheetName = "スプレッドシート名をここに"; // 対象のスプレッドシート名
  const csvFileName = "保存するCSVファイル名.csv";      // 保存するCSVファイル名
  const folderName = "保存先のGoogleドライブフォルダ名"; // 保存先フォルダ名

  // 対象のスプレッドシートを取得
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  if (spreadsheet.getName() !== spreadsheetName) {
    return; // 対象外のスプレッドシートの場合は終了
  }

  // データを取得
  const sheet = spreadsheet.getActiveSheet();
  const data = sheet.getDataRange().getValues();

  // CSV形式に変換
  const csvContent = data.map(row => row.join(",")).join("\n");

  // Googleドライブのフォルダに保存
  const folder = DriveApp.getFoldersByName(folderName).next(); // フォルダを取得
  const existingFiles = folder.getFilesByName(csvFileName);

  // 同じ名前のファイルが存在する場合は削除
  while (existingFiles.hasNext()) {
    existingFiles.next().setTrashed(true);
  }

  // 新しいCSVファイルを作成
  folder.createFile(csvFileName, csvContent);
  Logger.log(`CSVファイルを保存しました: ${csvFileName}`);
}
```
4\. ウェブアプリとしてデプロイ
- GASエディタの「デプロイ」→「新しいデプロイ」を選択。
- 「ウェブアプリ」を選び、プロジェクト名を設定。
- 「次のユーザーとしてアプリケーションを実行」を「自分」、
- 「ウェブアプリのアクセス」を「全員（匿名ユーザー）」に設定。

5\. Sattoに設定
- Sattoの「アプリノード」に移動。
- 必要なPOSTデータフォーマットを設定。

# Sattoの実装例
## フロー図
```mermaid
flowchart TD
   A[ユーザー入力 → 検索条件（地域とジャンル）を決定] --> B[AIノード① → GoogleマップAPIからデータ取得し、上位10件を選定]
   B --> C[AIノード② → スプレッドシート連携用のbody文を生成] 
   C --> D[アプリノード → Googleスプレッドシートにデータを書き込み]
```

## AIノード①のプロンプト
```
あなたのタスクは、指定された地域とカテゴリーに基づいてGoogleマップを利用してトップ10店舗を選び、それをスプレッドシートに連携できるbody文として出力することです。

### 入力条件
- 地域: {{入力.地域}}
- お店のカテゴリー: {{入力.お店のカテゴリー}}

以下のJSON形式で、指定された地域とカテゴリーに基づいてGoogleマップからトップ10店舗を検索し、情報を出力してください。

### 必要な情報
各店舗について、以下の6つの情報を取得してください。
- 店名
- 住所
- 緯度
- 経度
- レビュー評価
- レビュー数

### 選出基準
- トップ10店舗は、レビュー評価が高い順に選びます。
- 同評価の場合、レビュー数が多い順に並べてください。

### 注意事項
-緯度と経度はGoogleマップから正確な値を取得してください。
-指示を復唱しないでください。
-中間結果や余計な説明は出力しないでください。
-結果のみを出力してください。
-アウトプットを""（ダブルコーテーション）で囲わないでください。
```
## AIノード②のプロンプト
```
あなたは、ユーザーがAI①から生成されたデータをGoogleスプレッドシートにpostできるようサポートするアシスタントです。
まずは、ユーザーが提供するデータを受け取り、それをGoogleスプレッドシートにpostするために必要なbody文を作成してください。
以下のステップに従ってください:

1. データは {{AIノード①.output}} に格納されています。
2. 受け取ったデータを解析し、GoogleスプレッドシートのAPIに適した形式に変換する。
3. body文を出力する。

#フォーマットはこちらを使います
最大10行です。

{ "values": [ ["店名1", "住所1", "緯度1", "経度1", "レビュー評価1", "レビュー数1"], ["店名2", "住所2", "緯度2", "経度2", "レビュー評価2", "レビュー数2"] ] }

# 補足
- 指示の復唱はしないでください。
- 自己評価はしないでください。
- 結論やまとめは書かないでください。
- 最終成果物以外は出力しないでください。
- 出力結果をダブルクォーテーション("")で囲わないでください。
```

# 最後に
ポイントとしては、AIノードには明確に指示するために、「Googleマップから情報を収集する」役割と「body文を生成する」役割に分けるとうまく行きました。

スプレッドシートに緯度経度までリストアップしているので、Googleマイマップのインポート機能を使えば「パン屋マップ」、「カフェ巡りリスト」などがすぐ作れるようになります。

この記事が役に立った場合は、ぜひコメントやいいねをお願いします！
noteでは、スキル作成の背景や学び、さらに応用アイデアについて詳しく解説しています！
リンクはこちら👉[Googleマップ×スプレッドシートで簡単データ整理！非エンジニアでもできるスキル作り](https://note.com/lovely_hawk768/n/na14fafc33d67)