こんにちは。ITライターのもり(@moripro3)です!GoogleAppsScriptの記事をお届けしています!
「送付状作成ツール」を題材として、GASの自動化事例をシリーズでお届けしています。
Googleサービスのひとつである「Google連絡先」の登録データをスプレッドシートに取得して、送付状の宛先欄に自動で書き込むGASツールです。
「自動化でバックオフィス革命」がモットーのオートメーションラボ株式会社では、このような流れで「送付状作成」を行っています。
※この連載シリーズは、GASの処理である赤枠部の範囲を紹介します。シリーズの最後で実物のツール(スプレッドシート)を公開しますので、ぜひご活用ください。
当シリーズのメイン処理は「Google連絡先のデータをスプレッドシートに取得する処理」です。
前回までの記事で、Google連絡先から「氏名」「会社名」「役職」の3項目を取得してスプレッドシートに書き込む処理を作りました。
こんにちは。ITライターのもり(@moripro3)です!GoogleAppsScriptの記事をお届けしています! 「送付状作成ツール」を題材として、GASの自動化事例をシリーズでお届けしています。 Googleサービスのひと[…]
スクリプトを実行すると、Google連絡先の登録件数分のデータがスプレッドシートに出力されます。
さて、送付状作成に最も欠かせないデータといえば「住所」ですね。
Google連絡先から住所を取得する
今回の記事では「Google連絡先から住所を取得してスプレッドシートに書き込む処理」を作成します。
取得データを「郵便番号」「住所」「番地」に分割して、このように書き込むことを目標にします。
各連絡先の「住所フィールド」を取得する
Google連絡先から住所データを取得するためには、まず「住所フィールド」を取得します。
シリーズ2回目の記事(GASでGoogle連絡先の「会社名」と「役職」を取得する)で、会社データは、「会社フィールド」の中に存在することを紹介しました。
- Contactオブジェクト → 会社フィールド → 会社名
- Contactオブジェクト → 会社フィールド → 役職
住所データも同様に、「住所フィールド」の中に存在します。
- Contactオブジェクト → 住所フィールド → 住所
「住所フィールド」は、下記のように複数の項目から構成されています。
この「住所フィールド」をGASで取得していきましょう!
ContactクラスのgetAddressesメソッドで、連絡先の「住所フィールド」を取得します。
- Contactオブジェクト.getAddresses()
指定の連絡先の住所フィールドを取得します。
※戻り値は、AddressFieldクラスの配列です。
住所フィールドを取得するコードがこちらです。
function exportAddress() { //Google連絡先から連絡先一覧を取得 var contacts = ContactsApp.getContacts(); //連絡先の登録件数分ループする for (var i = 0; i < contacts.length; i++) { var addresses = contacts[i].getAddresses(); //住所フィールド Logger.log(addresses); } }
スクリプト実行結果です。登録件数分(4件)それぞれについて [AddressField] という配列が取得できたことがわかります。
[yy-mm-dd hh:mm:ss:xxx JST] [AddressField] //←連絡先1件目の住所フィールド [yy-mm-dd hh:mm:ss:xxx JST] [AddressField] //←連絡先2件目の住所フィールド [yy-mm-dd hh:mm:ss:xxx JST] [AddressField] //←連絡先3件目の住所フィールド [yy-mm-dd hh:mm:ss:xxx JST] [AddressField] //←連絡先4件目の住所フィールド
この「住所フィールド」の中に「住所データ」が含まれています。
住所フィールドから「住所データ」を取得する
「住所フィールド」はAddressFieldクラスのオブジェクトです(公式ドキュメントはこちら)
AddressFieldクラスのgetAddressメソッドで「住所データ」を取得します。
- AddressFieldオブジェクト.getAddress()
住所フィールドの「住所」を文字列で取得します。
各連絡先の「住所フィールド」から「住所データ」を取得するコードです。
AddressFieldオブジェクトの変数 address
は配列のため、要素番号の指定が必要です。Google連絡先では1連絡先につき複数住所を登録できますが、この記事では、最初の1件目を取得することにします。そのため、要素番号[0]を指定します。
function exportAddress() { //Google連絡先から連絡先一覧を取得 var contacts = ContactsApp.getContacts(); //連絡先の登録件数分ループする for (var i = 0; i < contacts.length; i++) { var addresses = contacts[i].getAddresses(); //住所フィールド if (addresses.length > 0) { //住所情報が未登録の場合エラーになるため var address = addresses[0].getAddress(); //最初の1件目のみ取得 Logger.log(address); } } }
スクリプト実行ログです。連絡先4件分の「住所データ」を取得できました。
[yy-mm-dd hh:mm:ss:xxx JST] 千代田区▲▲1-2-3 ABCビル 7階 東京都 〒100-0004 JP //連絡先1件目の住所 [yy-mm-dd hh:mm:ss:xxx JST] 千代田区○○2-3-4 東京都 100-0004 JP //連絡先2件目の住所 [yy-mm-dd hh:mm:ss:xxx JST] 東京都千代田区□□5-4-3 〒100-0004 JP //連絡先3件目の住所 [yy-mm-dd hh:mm:ss:xxx JST] 千代田区●●6-7-8 XXXビル 5F 東京都 100-0005 JP //連絡先4件目の住所
住所データには改行が入っています。たとえば、連絡先1件目の住所データはこのような文字列です。
千代田区▲▲1-2-3(改行コード)ABCビル 7階(改行コード)東京都 〒100-0004(改行コード)JP
さて、この改行入りの文字列を「郵便番号」「住所」「番地」に分割していきましょう。
住所データを「郵便番号」「住所」「番地」に分割する
Google連絡先の住所フィールドは入力項目が複数に分かれているので、人によって登録方法がバラバラであることが予想されます。
この記事では下記2パターンのみを想定します。
- パターン1 番地2あり
- パターン2 番地2なし
それぞれを文字列で表すと、このようになります。「番地あり/なし」で改行コードの数が異なります。
//番地2あり 千代田区▲▲1-2-3(改行コード)ABCビル 7階(改行コード)東京都 〒100-0004(改行コード)JP //番地2なし 千代田区▲▲1-2-3(改行コード)東京都 〒100-0004(改行コード)JP
この文字列を「郵便番号」「住所」「番地」に分けるために、まずは改行コードで分割します。
住所データを改行コードで分割する
住所データを改行コードで分割して配列に格納します。改行コードは \n (バックスラッシュ+n)です。
15行目で改行区切りを追加します。
function exportAddress() { //Google連絡先から連絡先一覧を取得 var contacts = ContactsApp.getContacts(); //連絡先の登録件数分ループする for (var i = 0; i < contacts.length; i++) { var addresses = contacts[i].getAddresses(); //住所フィールド if (addresses.length > 0) { //住所情報が未登録の場合エラーになるため var address = addresses[0].getAddress(); //最初の1件目のみ取得 var arrAddress = address.split('\n'); //改行コードで分割 Logger.log(arrAddress); } } }
スクリプト実行ログです。住所データを改行で分割して、配列にしました。
[yy-mm-dd hh:mm:ss:xxx JST] [千代田区▲▲1-2-3, ABCビル 7階, 東京都 〒100-0004, JP] //番地あり [yy-mm-dd hh:mm:ss:xxx JST] [千代田区○○2-3-4, 東京都 100-0004, JP] //番地なし [yy-mm-dd hh:mm:ss:xxx JST] [東京都千代田区□□5-4-3, 〒100-0004, JP] //番地なし [yy-mm-dd hh:mm:ss:xxx JST] [千代田区●●6-7-8, XXXビル 5F, 東京都 100-0005, JP] //番地あり
番地あり・番地なしで配列の長さが異なります。
このような規則性に基づいて、配列からデータを取り出していきます。
住所データの配列を「郵便番号」「都道府県」「住所」「番地」に仕分けする
住所フィールドを受け取ると「郵便番号」「都道府県」「住所」「番地」に仕分けして返す関数を作成します。
/* * 「住所フィールド」の1件目の住所データを「郵便番号」「都道府県」「住所」「番地」に分割する * * @param {String} 住所フィールド * @return {String} 郵便番号,都道府県,住所,番地 */ function splitAddress(addresses) { var zipcode = ''; //①郵便番号 var prefecture = ''; //②都道府県 var address1 = ''; //③住所 var address2 = ''; //④番地 if (addresses.length > 0) { var address = addresses[0].getAddress(); //1件目のみ取得 var arrAddress = address.split('\n'); //改行コードで分割 if (arrAddress.length === 4) { //番地あり address1 = arrAddress[0]; //住所 address2 = arrAddress[1]; //番地 //「郵便番号」と「都道府県」を分割 [zipcode, prefecture] = SplitZipcodePrefecture(arrAddress[2]); } else if (arrAddress.length === 3) { //番地なし address1 = arrAddress[0]; //住所 //「郵便番号」と「都道府県」を分割 [zipcode, prefecture] = SplitZipcodePrefecture(arrAddress[1]); } } //それ以外の登録ケースは全項目空で返す return [zipcode,prefecture,address1,address2]; }
「都道府県」と「郵便番号」を半角スペースで分割する
「都道府県」と「郵便番号」は下記のように半角スペースで区切られた文字列になっています。
(例)東京都 〒100-0004
- 番地ありの場合(length 4)→要素番号[2]
- 番地なしの場合(length 3)→要素番号[1]
この規則を利用して、「都道府県 郵便番号」の文字列を受け取り「都道府県」と「郵便番号」に分割する関数を作ります。
※「都道府県」の入力欄が空で「住所」欄に入力されているケースも考慮します。
コードがこちらです。
/* * 「郵便番号」と「都道府県」の文字列を分割する * * @param {String} 郵便番号 都道府県 (ex)東京都 〒100-0004 * @return {String} 郵便番号, 都道府県 */ function SplitZipcodePrefecture(str) { var zipcode = ''; var prefecture = ''; var arrZipPre = str.split(' '); //半角スペースで区切る if (arrZipPre.length === 2) { //通常パターン zipcode = arrZipPre[1]; prefecture = arrZipPre[0]; } else if (arrZipPre.length === 1) { //都道府県の入力がない場合 zipcode = arrZipPre[0]; } zipcode = zipcode.replace('〒',''); //記号削除 return [zipcode, prefecture]; }
Google連絡先の住所データには改行コードが含まれているので、取得した文字列を分割する関数を2つ作りました。
- splitAddress関数
→「住所フィールド」の1件目の住所データを「郵便番号」「都道府県」「住所」「番地」に分割する - SplitZipcodePrefecture
→「郵便番号」と「都道府県」の文字列を分割する
【スクリプトまとめ】Google連絡先から「住所」を取得する
今回の記事では、GASで「Google連絡先」から住所データを取得する方法を紹介しました。
これまでの記事で、下記の7項目を取得できました。
- 会社名
- 役職
- 氏名
- 住所データ(郵便番号・住所・番地)
エントリポイントのexportContact関数です。23行目~29行目が今回追加した行です。
※writeSpreadSheet関数は、前回記事(GASでGoogle連絡先から取得したデータをスプレッドシートに書き込む)で作成しています。
function exportContact() { //Google連絡先から連絡先一覧を取得 var contacts = ContactsApp.getContacts(); var arrContactAll = []; //スプレッドシート書き込み用の配列 //連絡先の登録件数分ループする for (var i = 0; i < contacts.length; i++) { var fullName = contacts[i].getFullName(); //氏名 var companies = contacts[i].getCompanies(); //会社フィールド if (companies.length > 0) { //会社情報が未登録の場合エラーになるため //変数companiesは配列なので要素番号[0]の指定が必要 var companyName = companies[0].getCompanyName(); //会社名 var jobTitle = companies[0].getJobTitle(); //役職 } var addresses = contacts[i].getAddresses(); //住所フィールド var [zipcode,prefecture,address1,address2] = splitAddress(addresses); address1 = prefecture + address1; //都道府県と住所を連結 //ひとり分の連絡先を配列に格納 var arrContactPerson = [companyName,jobTitle,fullName,zipcode,address1,address2]; //スプレッドシート書き込み用配列に追加 arrContactAll.push(arrContactPerson); } //配列をスプレッドシートにセット if (arrContactAll.length > 0) { //中身がある場合のみ writeSpreadSheet(arrContactAll); } }
次回は、Google連絡先から「メールアドレス」「電話番号」を取得する方法を紹介します。
こんにちは。ITライターのもり(@moripro3)です!GoogleAppsScriptの記事をお届けしています! 「送付状作成ツール」を題材として、GASの自動化事例をシリーズでお届けしています。 Googleサービスのひと[…]
【連載目次:GASで作る送付状作成ツール】
- GASでGoogle連絡先の「氏名」を取得する【送付状作成ツール①】
- GASでGoogle連絡先の「会社名」と「役職」を取得する【送付状作成ツール②】
- GASでGoogle連絡先から取得したデータをスプレッドシートに書き込む【送付状作成ツール③】
- GASでGoogle連絡先から「住所」を取得する【送付状作成ツール④】
- GASでGoogle連絡先から「メールアドレス」と「電話番号」を取得する【送付状作成ツール⑤】
- GASでGoogle連絡先に新規登録された連絡先のみを取得する【送付状作成ツール⑥】
- GASでGoogle連絡先から取得したデータを使用して送付状を作る【送付状作成ツール⑦】<※ツール公開あり>