こんにちは。ITライターのもり(@moripro3)です!GoogleAppsScriptの記事をお届けしています!
「送付状作成ツール」を題材として、GASの自動化事例をシリーズでお届けしています。
Googleサービスのひとつである「Google連絡先」の登録データをスプレッドシートに取得して、送付状の宛先欄に自動で書き込むGASツールです。
※連載シリーズの最後で実物のツール(スプレッドシート)を公開しますので、ぜひご活用ください。
当シリーズのメイン処理は「Google連絡先のデータをスプレッドシートに取得する処理」です。
前回までの記事で、Google連絡先から「氏名」「会社名」「役職」「住所」を取得してスプレッドシートに書き込む処理を作りました。
こんにちは。ITライターのもり(@moripro3)です!GoogleAppsScriptの記事をお届けしています! 「送付状作成ツール」を題材として、GASの自動化事例をシリーズでお届けしています。 Googleサービスのひと[…]
スクリプトを実行すると、Google連絡先の登録件数分のデータがスプレッドシートに出力されます。
Google連絡先からメールアドレス・電話番号・ラベルを取得する
今回の記事では、各連絡先から「メールアドレス/ラベル」「電話番号/ラベル」を取得して、スプレッドシートに書き込む処理を作成します。
Google連絡先では、1つの連絡先につき、メールアドレス・電話番号を複数登録できます。仕事用・自宅用など複数登録されていることを想定して、最大2件取得する仕様にします。
Google連絡先から「メールアドレス/ラベル」「電話番号/ラベル」を取得するためには、まず「EmailField」「PhoneField」取得します。
これまでシリーズを通して紹介してきた「会社フィールド」「住所フィールド」と同じ考え方です。
- EmailField
- メールアドレス
- ラベル
- PhoneField
- 電話番号
- ラベル
まずはメールアドレスの取得方法から紹介していきます。
Google連絡先からメールアドレスとラベルを取得する
Google連絡先から「メールアドレス/ラベル」を取得する方法を紹介します。
Google連絡先の「EmailField」を取得する
「メールアドレス」と「ラベル」を取得するには、このような順番でアクセスします。
- Contactオブジェクト → EmailField→ メールアドレス 1~n
- Contactオブジェクト → EmailField→ ラベル 1~n
そこで、まずは「EmailField」を取得します。
ContactクラスのgetEmailsメソッドで「EmailField」を取得します。
- Contactオブジェクト.getEmails()
指定の連絡先のメールアドレスのフィールドを取得します。
※戻り値は、EmailFieldクラスの配列です。
各連絡先の「EmailField」を取得するコードがこちら。
function exportEmails() { //Google連絡先から連絡先一覧を取得 var contacts = ContactsApp.getContacts(); //連絡先の登録件数分ループする for (var i = 0; i < contacts.length; i++) { var emails = contacts[i].getEmails(); //Emailフィールド Logger.log(emails); } }
スクリプト実行ログです。Google連絡先に登録している連絡先それぞれについて、メールアドレスが何件登録されているかがわかります。
たとえば連絡先1件目には3件のメールアドレス、連絡先2件目には2件のメールアドレスが登録されています。
[yy-mm-dd hh:mm:ss:xxx JST] [EmailField, EmailField, EmailField] //連絡先1件目 [yy-mm-dd hh:mm:ss:xxx JST] [EmailField, EmailField] //連絡先2件目 [yy-mm-dd hh:mm:ss:xxx JST] [EmailField] //連絡先3件目 [yy-mm-dd hh:mm:ss:xxx JST] [EmailField, EmailField] //連絡先4件目
それぞれの [EmailField] の中に「メールアドレス」と「ラベル」のデータが含まれています。データを取り出してみましょう。
「EmailField」から「メールアドレス」と「ラベル」を取得する
EmailFieldクラスの公式ドキュメントがこちらです。2つのメソッドを使用します。
- 「メールアドレス」の取得 → getAddressメソッド
- 「ラベル」の取得 → getLabelメソッド
- EmailFieldオブジェクト.getAddress()
「メールアドレス」を取得します。
- EmailFieldオブジェクト.getLabel()
「ラベル」を取得します。
各連絡先の「EmailField」から「メールアドレス」と「ラベル」を取得するコードです。
まずは動作確認のため、最初の1件目のみを取得しています。要素番号[0]を指定します。
function exportEmails() { //Google連絡先から連絡先一覧を取得 var contacts = ContactsApp.getContacts(); //連絡先の登録件数分ループする for (var i = 0; i < contacts.length; i++) { var emails = contacts[i].getEmails(); //Emailフィールド if (emails.length > 0) { //メールアドレス未登録の場合エラーになるため var email = emails[0].getAddress(); //最初の1件目のみ取得 var label = emails[0].getLabel(); //最初の1件目のみ取得 Logger.log('メールアドレス => %s | ラベル => %s', email, label); } } }
スクリプト実行ログです。4件の連絡先それぞれについて、最初の1件目の「メールアドレス」と「ラベル」が取得できました。
[yy-mm-dd hh:mm:ss:xxx JST] メールアドレス => sato1@dummy.co.jp | ラベル => WORK_EMAIL [yy-mm-dd hh:mm:ss:xxx JST] メールアドレス => tanaka1@dummy.co.jp | ラベル => WORK_EMAIL [yy-mm-dd hh:mm:ss:xxx JST] メールアドレス => suzuki@dummy.co.jp | ラベル => WORK_EMAIL [yy-mm-dd hh:mm:ss:xxx JST] メールアドレス => takahashi1@dummy.co.jp | ラベル =>
最大2件の「メールアドレス」と「ラベル」を取得する
この記事では、登録メールアドレスのうち、最初の2件を取得することにします。
メールアドレスの登録状況と取得結果は下記のようになります。
- 3件以上 → 最初の2件のみを取得
- 2件 → 2件を取得
- 1件 → 1件を取得
- 0件 → 取得しない
Emailフィールドを受け取り、最大2件の「メールアドレス」「ラベル」を取得して、 [メールアドレス1, ラベル1, メールアドレス2, ラベル2] の配列を返す関数 getEmails を作ります。
function exportEmails() { //Google連絡先から連絡先一覧を取得 var contacts = ContactsApp.getContacts(); //連絡先の登録件数分ループする for (var i = 0; i < contacts.length; i++) { var emails = contacts[i].getEmails(); //Emailフィールド var arrEmails = getEmails(emails); Logger.log(arrEmails); } } /* * 「メールアドレス」と「ラベル」の値を取得する * * @param {Object} Emailフィールド * @return {Object} [メールアドレス1, ラベル1, メールアドレス2, ラベル2]の配列 */ function getEmails(emails) { var arrEmails = []; var email,label; for (var i = 0; i < 2; i++) { //最初の2件のみ取得 try { email = emails[i].getAddress(); label = emails[i].getLabel(); } catch(e) { //登録無しの場合(エラーになる)は空白で返す email = ''; label = ''; } arrEmails.push([email,label]); //二次元配列が作成される } //二次元配列を一次元配列に変換 arrEmails = Array.prototype.concat.apply([],arrEmails); return arrEmails; }
スクリプト実行ログです。各連絡先の「メールアドレス」と「ラベル」を一次元配列にしました。
[yy-mm-dd hh:mm:ss:xxx JST] [sato1@dummy.co.jp, WORK_EMAIL, sato2@dummy.co.jp, HOME_EMAIL] [yy-mm-dd hh:mm:ss:xxx JST] [tanaka1@dummy.co.jp, WORK_EMAIL, tanaka2@dummy.co.jp, HOME_EMAIL] [yy-mm-dd hh:mm:ss:xxx JST] [suzuki@dummy.co.jp, WORK_EMAIL, , ] [yy-mm-dd hh:mm:ss:xxx JST] [takahashi1@dummy.co.jp, , takahashi2@dummy.co.jp, HOME_EMAIL]
処理のポイントは2点です。
【ポイント1】try – catch 文でのエラー処理
メールアドレスの登録が2件未満の場合、getAddressメソッド・getLabelメソッドでエラーになります。
エラー、つまり、登録がない場合は空白で返したいので、try~catch文でエラーハンドリングをしています。
try { //エラー検知の対象となる処理 } catch(e) { //エラーが発生した場合の処理 }
【ポイント2】二次元配列を一次元配列に変換する
下記のコードで二次元配列を一次元配列に変換しています。最終的にスプレッドシートに書き込むために必要な処理です。
arrEmails = Array.prototype.concat.apply([],arrEmails); // [[sato1@dummy.co.jp, WORK_EMAIL], [sato2@dummy.co.jp, HOME_EMAIL]] ←二次元配列 // ↓ // [sato1@dummy.co.jp, WORK_EMAIL, sato2@dummy.co.jp, HOME_EMAIL] ←一次元配列
Google連絡先から電話番号とラベルを取得する
次に、電話番号の取得処理を作ります。メールアドレスの取得とまったく同じ仕組みのため、詳細なコードは省略します。
Google連絡先の「PhoneField」を取得する
ContactクラスのgetPhonesメソッドで「PhoneField」を取得します。
- Contactオブジェクト.getPhones()
指定の連絡先の電話番号のフィールドを取得します。
※戻り値は、PhoneFieldクラスの配列です。
「PhoneField」から「電話番号」と「ラベル」を取得する
PhoneFieldクラスの公式ドキュメントがこちらです。
- 「電話番号」の取得 → getPhoneNumberメソッド
- 「ラベル」の取得 → getLabelメソッド
- PhoneFieldオブジェクト.getPhoneNumber()
「電話番号」を取得します。
- PhoneFieldオブジェクト.getLabel()
「ラベル」を取得します。
最大2件の「電話番号」と「ラベル」を取得する
Phoneフィールドを受け取り、最大2件の「電話番号」「ラベル」を取得して、 [電話番号1, ラベル1, 電話番号2, ラベル2] の配列を返す関数 getPhones を作ります。
/* * 「電話番号」と「ラベル」の値を取得する * * @param {Object} Phoneフィールド * @return {Object} [電話番号1, ラベル1, 電話番号2, ラベル2]の配列 */ function getPhones(phones) { var arrPhones = []; var phone,label; for (var i = 0; i < 2; i++) { //最初の2件のみ取得 try { phone = phones[i].getPhoneNumber(); label = phones[i].getLabel(); } catch(e) { //登録無しの場合(エラーになる)は空白で返す phone = ''; label = ''; } arrPhones.push([phone,label]); } //二次元配列を一次元配列に変換 arrPhones = Array.prototype.concat.apply([],arrPhones); return arrPhones; }
【スクリプトまとめ】Google連絡先からデータを取得する
今回の記事では、GASで「Google連絡先」から「メールアドレス/ラベル」と「電話番号/ラベル」を取得する方法を紹介しました。
これまでの記事で、目的の項目をすべて取得できました。
これまでに作成した全スクリプトを掲載します。エントリポイント exportContact 関数を実行すると、上記のようにデータが取得できます(書き込み先のシート名は contact にしています)
exportContact 関数の前回記事からの追加点は黄色ハイライトの行です。
- 31,32行目 → 「メールアドレス/ラベル」の取得処理
- 34,35行目 → 「電話番号/ラベル」の取得処理
- 39行目 → スプレッドシートに書き込むために、他項目の一次元配列と連結しています
/* * 【エントリポイント】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(); //Companyフィールド if (companies.length > 0) { //会社情報が未登録の場合エラーになるため //変数companiesは配列なので要素番号[0]の指定が必要 var companyName = companies[0].getCompanyName(); //会社名 var jobTitle = companies[0].getJobTitle(); //役職 } var addresses = contacts[i].getAddresses(); //Addressフィールド var [zipcode,prefecture,address1,address2] = splitAddress(addresses); address1 = prefecture + address1; //都道府県と住所を連結 var emails = contacts[i].getEmails(); //Emailフィールド var arrEmails = getEmails(emails); var phones = contacts[i].getPhones(); //Phoneフィールド var arrPhones = getPhones(phones); //ひとり分の連絡先を配列に格納 var arrContactPerson = [companyName,jobTitle,fullName,zipcode,address1,address2]; arrContactPerson = arrContactPerson.concat(arrEmails,arrPhones); //配列の連結 //スプレッドシート書き込み用配列に追加 arrContactAll.push(arrContactPerson); } //配列をスプレッドシートにセット if (arrContactAll.length > 0) { //中身がある場合のみ writeSpreadSheet(arrContactAll); } } /* * Addressフィールドの1件目を「郵便番号」「都道府県」「住所」「番地」に分割する * * @param {String} Addressフィールド * @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]; } /* * 「郵便番号」と「都道府県」の文字列を分割する * * @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]; } /* * 「メールアドレス」と「ラベル」の値を取得する * * @param {Object} Emailフィールド * @return {Object} [メールアドレス1, ラベル1, メールアドレス2, ラベル2]の配列 */ function getEmails(emails) { var arrEmails = []; var email,label; for (var i = 0; i < 2; i++) { //最初の2件のみ取得 try { email = emails[i].getAddress(); label = emails[i].getLabel(); } catch(e) { //登録無しの場合(エラーになる)は空白で返す email = ''; label = ''; } arrEmails.push([email,label]); //二次元配列が作成される } //二次元配列を一次元配列に変換 arrEmails = Array.prototype.concat.apply([],arrEmails); return arrEmails; } /* * 「電話番号」と「ラベル」の値を取得する * * @param {Object} Phoneフィールド * @return {Object} [電話番号1, ラベル1, 電話番号2, ラベル2]の配列 */ function getPhones(phones) { var arrPhones = []; var phone,label; for (var i = 0; i < 2; i++) { //最初の2件のみ取得 try { phone = phones[i].getPhoneNumber(); label = phones[i].getLabel(); } catch(e) { //登録無しの場合(エラーになる)は空白で返す phone = ''; label = ''; } arrPhones.push([phone,label]); } //二次元配列を一次元配列に変換 arrPhones = Array.prototype.concat.apply([],arrPhones); return arrPhones; } /* * 配列を指定シートの最終行+1行目にセットする * * @param {Object} 連絡先データを格納した配列 */ function writeSpreadSheet(arr) { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('contact'); var lastRow = sheet.getLastRow(); var col = 1; //A列 var i = arr.length; //配列タテ var j = arr[0].length; //配列ヨコ //配列をスプレッドシートにセットする(最終行+1行目) sheet.getRange(lastRow+1, col, i, j).setValues(arr); }
さて、ここまでで目的のデータをすべて取得するスクリプトを作りました。連絡先は1回取得すれば終わり・・・ではなく、Google連絡先の登録データは随時増えていきますよね。
そこで次回は、「新規連絡先を差分追加する処理」を加えます。「スクリプト前回実行時から今回実行時までの間に新規登録した連絡先」を、スプレッドシートの最終行に追加します。
こんにちは。ITライターのもり(@moripro3)です!GoogleAppsScriptの記事をお届けしています! 「送付状作成ツール」を題材として、GASの自動化事例をシリーズでお届けしています。 Googleサービスのひと[…]
【連載目次:GASで作る送付状作成ツール】
- GASでGoogle連絡先の「氏名」を取得する【送付状作成ツール①】
- GASでGoogle連絡先の「会社名」と「役職」を取得する【送付状作成ツール②】
- GASでGoogle連絡先から取得したデータをスプレッドシートに書き込む【送付状作成ツール③】
- GASでGoogle連絡先から「住所」を取得する【送付状作成ツール④】
- GASでGoogle連絡先から「メールアドレス」と「電話番号」を取得する【送付状作成ツール⑤】
- GASでGoogle連絡先に新規登録された連絡先のみを取得する【送付状作成ツール⑥】
- GASでGoogle連絡先から取得したデータを使用して送付状を作る【送付状作成ツール⑦】<※ツール公開あり>