AppSheetで撮影した写真から緯度経度を取得し、Yahoo!のリバースジオコーダAPIで逆ジオコーディングを行い、撮影場所の住所やランドマーク情報を自動で記録・地図表示できる仕組みを作ったときの備忘録です。
このページでは、Apps Scriptのコードと、AppSheet側の設定、Yahoo APIの使い方を中心に記録しています。
リンク
この記事でやること
- AppSheetで撮影と同時に緯度経度を自動取得
- 取得した位置情報をApps Script経由でYahoo!位置情報APIに送信
- 返ってきた住所とランドマーク情報をアプリに反映
- AppSheetのマップビューで撮影地点を可視化

使ったもの
項目 | 内容 |
---|---|
AppSheet | フォーム入力・位置情報取得・Automation実行 |
Yahoo!リバースジオコーダAPI | 位置座標 → 住所取得 |
Yahoo!ローカルサーチAPI | 位置座標 → 周辺施設情報 |
Apps Script | APIの呼び出しとレスポンス処理 |
Apps Scriptのコード
function getAddressFromYahoo(lat, lng) {
var appId = PropertiesService.getScriptProperties().getProperty("APP_ID");
var url = "https://map.yahooapis.jp/geoapi/V1/reverseGeoCoder" +
"?lat=" + lat +
"&lon=" + lng +
"&appid=" + appId +
"&output=json";
try {
var response = UrlFetchApp.fetch(url); // APIリクエストを送信
var json = JSON.parse(response.getContentText()); // レスポンスをJSON形式で解析
if (json.Feature && json.Feature.length > 0) {
Logger.log(json.Feature[0].Property.Address);
return json.Feature[0].Property.Address; // 住所を取得
} else {
return "住所が取得できません";
}
} catch (e) {
Logger.log("エラー: " + e.message); // エラーをログに記録
return "エラーが発生しました";
}
}
function getNearestPlaceFromYahoo(lat, lng, dist) {
var appId = PropertiesService.getScriptProperties().getProperty("APP_ID");
var url = "https://map.yahooapis.jp/search/local/V1/localSearch" +
"?appid=" + appId +
"&lat=" + lat +
"&lon=" + lng +
"&dist=" + dist +
"&output=json" +
"&sort=geo"; // 距離順でソート
try {
var response = UrlFetchApp.fetch(url); // APIリクエストを送信
var json = JSON.parse(response.getContentText()); // レスポンスをJSON形式で解析
if (json.Feature && json.Feature.length > 0) {
var nearestPlace = json.Feature[0]; // 距離順にソートされているため、最初の要素が一番近い場所
Logger.log(json.Feature[0].Name);
return json.Feature[0].Name
} else {
return "検索結果が見つかりませんでした";
}
} catch (e) {
Logger.log("エラー: " + e.message); // エラーをログに記録
return "エラーが発生しました";
}
}
※ Yahoo! APIのClient ID(アプリケーションID)は事前に取得して、スクリプトプロパティに保存しておく必要があります。
AppSheet側の設定
AppSheetでは、写真の撮影と同時に緯度経度を自動取得し、その情報を使ってBotからApps Script関数を実行する構成にしています。
① テーブルのカラム構成
カラム名 | Type | 内容・式 |
---|---|---|
ID | Text | = UNIQUEID()(主キー) |
日時 | DateTime | = NOW()(写真撮影日時) |
写真 | Image | フォームからアップロード |
位置情報 | LatLong | = HERE()(写真撮影時の現在地) |
緯度 | Decimal | = LAT([位置情報]) |
経度 | Decimal | = LONG([位置情報]) |
住所 | Address | APIのレスポンスを格納 |
ランドマーク | Text | APIのレスポンスを格納 |
日付 | Date | = Date([日時])(カレンダー表示用) |
②データの設定位置情報はLATLONG型の列にHERE()で取得。
仮想列を作成しLAT、LONG関数で緯度と経度に分割

③ トリガー
AppSheetで写真と位置情報が入力されたときに自動でBotが発動。

④ Function
BotからApps Scriptを呼び出す。住所取得とランドマーク取得は別関数で。引数に経度と緯度を渡す

関数例:
getAddressFromYahoo(Lat([位置情報]), Long([位置情報]))
getNearestPlaceFromYahoo(Lat([位置情報]), Long([位置情報]), 1.0)
⑤結果の保存
スクリプトの返り値を「住所」列と「ランドマーク名」列に保存


呼び出す構成にしておくことで、住所と施設名の両方を別々に取得・保存できるようにしています。
この記事ではまったこと
- 「逆ジオコーディング」という言葉を知らなかった
→ 住所 → 緯度経度が「ジオコーディング」、その逆が「逆ジオコーディング」 - YahooデベロッパーズネットワークでのAPIキー取得がやや手間だった(申請ページの場所や手順がわかりづらい)
- ローカルサーチAPIの
dist
パラメータが必須だったことに注意が必要 dist
の単位はkmなので、500m以内の検索には0.5
を指定する必要あり- 最終的に「一番近い場所を1件だけ返す」ことで精度も実用性もクリアできた
その他注意点
- Yahoo APIの使用回数制限: 無料枠では1アプリケーションあたり1日最大5,000回(APIごとに異なる)まで。アクセス頻度が高い場合は注意。
- 商用利用制限: 多くのYahoo APIは商用利用不可、または事前申請が必要。 公開アプリや有償サービスでの利用時は、Yahoo!デベロッパーズサイトを必ず確認。
まとめ
この記事では、AppSheetで撮影した写真に緯度経度を自動付与し、Yahoo! APIでその場の住所とランドマークを取得する仕組みを紹介しました。
マップ表示まで自動化できたことで、旅行の思い出や現地の記録がより豊かなものになりました。
アプリとしての完成形(例:旅行記録アプリなど)は、以下書籍で出版中です。
導入手順も詳しく書いていますので、ぜひ手に取って見てください。
リンク
コメント