目次
はじめに
お仕事で1000件近くある施設名一覧から住所や電話番号を調べて記入する作業があったので、Google Map ApiとgoogleスプレッドシートとGoogle App Scriptを利用して自動化してみた。
ちなみに最初にいただいた施設一覧のリストはこんな感じ。
A列 | B列 | C列 | D列 |
---|---|---|---|
名称 | 郵便番号 | 住所 | 電話番号 |
東京タワー | |||
スカイツリー | |||
通天閣 |
この空欄箇所を埋める作業を自動化しました。
なんと作業時間はものの数分で約1000件の住所と電話番号をまとめたリストが完成しました!コードを書く時間を加えても1時間くらいで終わりました。
「Googleで調べて記入するといい」なんてことを言われたけど、手作業で検索していたら手分けしても何時間かかったことか。
10数件であれば手作業でもいいけど、1000件は結構な量。
やっててよかった、公文式。プログラミングとChatGPT。
コードの説明
というわけで、施設名から郵便番号、住所、電話番号を自動で調べて入力してくれるコードがこちら。
function fillJapaneseAddressAndPhone(startRow) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const apiKey = "ここにAPIキーを入力"; // ここにAPIキーを入力
const lastRow = sheet.getLastRow();
startRow = startRow || 2; // デフォルトで2行目から開始(引数が指定されていない場合)
for (let i = startRow; i <= lastRow; i++) {
const facilityName = sheet.getRange(i, 1).getValue(); // A列の施設名
if (facilityName) {
// Step 1: 施設名を使ってPlace IDを取得
const searchQuery = encodeURIComponent(facilityName);
const response = UrlFetchApp.fetch(`https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=${searchQuery}&inputtype=textquery&fields=place_id,formatted_address,name&key=${apiKey}`);
const json = JSON.parse(response.getContentText());
if (json.candidates && json.candidates.length > 0) {
const placeId = json.candidates[0].place_id;
// Step 2: Place IDを使って詳細情報(電話番号、住所)を取得
const detailsResponse = UrlFetchApp.fetch(`https://maps.googleapis.com/maps/api/place/details/json?place_id=${placeId}&fields=formatted_phone_number,name,formatted_address&key=${apiKey}`);
const detailsJson = JSON.parse(detailsResponse.getContentText());
const phone = detailsJson.result.formatted_phone_number || "電話番号が見つかりませんでした";
const resultAddress = detailsJson.result.formatted_address;
// Step 3: 英語の住所を日本語に変換し、郵便番号を取得
const geocodeResponse = UrlFetchApp.fetch(`https://maps.googleapis.com/maps/api/geocode/json?address=${encodeURIComponent(resultAddress)}&key=${apiKey}&language=ja`);
const geocodeJson = JSON.parse(geocodeResponse.getContentText());
if (geocodeJson.results && geocodeJson.results.length > 0) {
const japaneseAddress = geocodeJson.results[0].formatted_address;
const postalCode = geocodeJson.results[0].address_components.find(component => component.types.includes("postal_code")).long_name;
sheet.getRange(i, 2).setValue(postalCode); // B列に郵便番号
sheet.getRange(i, 3).setValue(japaneseAddress); // C列に日本語住所
} else {
sheet.getRange(i, 2).setValue("郵便番号が見つかりませんでした");
sheet.getRange(i, 3).setValue("日本語住所が見つかりませんでした");
}
sheet.getRange(i, 4).setValue(phone); // D列に電話番号
} else {
sheet.getRange(i, 2).setValue("郵便番号が見つかりませんでした");
sheet.getRange(i, 3).setValue("施設が見つかりませんでした");
sheet.getRange(i, 4).setValue("電話番号が見つかりませんでした");
}
}
}
}
// 途中から処理を開始したい場合
// fillJapaneseAddressAndPhone(428);
function testFillJapaneseAddressAndPhone() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// テスト用データをシートにセット
sheet.getRange("A2").setValue("東京タワー"); // テスト施設名
// 実際の処理を実行
fillJapaneseAddressAndPhone();
// テスト結果の出力
Logger.log("B2 (郵便番号): " + sheet.getRange("B2").getValue());
Logger.log("C2 (日本語住所): " + sheet.getRange("C2").getValue());
Logger.log("D2 (電話番号): " + sheet.getRange("D2").getValue());
}
関数の説明
- fillJapaneseAddressAndPhone(startRow): 指定した行から最後の行まで、施設名をもとに郵便番号、住所、電話番号を取得し、シートに記入する関数です。
- testFillJapaneseAddressAndPhone(): この関数は、テストデータをシートにセットし、実際の処理を実行します。
手順
手順としては、ざっくりとこんな感じ。
STEP
Google Maps Apiキーを取得
「Google Map Api APIキー 取得」で調べてね。
Google Maps Platform APIキー取得方法に従ってAPIキーを取得。
STEP
Googleスプレッドシートで新規作成
Googleスプレッドシートで新しいシートを作成します。
A列に施設名を記入します。
STEP
Google App Scriptでコードを入力
スプレッドシートで「拡張機能」から「Google Apps Script」を選択します。
上記のコードをコピペし、APIキーを入力します。
STEP
処理を実行
- 作成したスクリプトを保存し、スクリプトエディタから実行します。
- 処理が完了するのを待ちます。
よくあるエラーと解決方法
- APIキーが無効: Google Cloud ConsoleでAPIキーが有効になっているか、必要なAPIが有効化されているか確認してください。
- 施設が見つからない: 施設名が正確か確認してください。都市名や都道府県を追加すると見つけやすい場合があります。
- APIリクエストの制限超過: 無料枠を超えている場合は、料金が発生します。適切なプランにアップグレードするか、リクエスト数を減らしてください。
特にAPIリクエストの超過に関してはご注意を。気づいたら請求が大変なことになっている場合もあるので(過去に苦い経験あり)
カスタマイズしたい場合は、上記のコードをベースにChat GPTにお願いするとよりいいかもしれません。