Webページのフェッチ
メールの送信は、スプレッドシートの内容を外部へ送信するのに役立ちますが、反対に「外部のデータをスプレッドシートに取り込む」ということはできないのでしょうか。
もし、取得したいデータがWeb上に公開されているのであれば、そのアドレスからデータを取得し、処理することが可能です。「UrlFetchApp」というオブジェクトを利用することで、特定のURLからデータを取得することができるのです。通常、JavaScriptでは、スクリプトが設置されたサイト外へのアクセスは制限されていますが、Google Apps Scriptではこの部分をサーバー側で処理することで、サイト外のデータを得ることができます。これは次のように行います。
UrlFetchApp.fetch( アドレス )
UrlFetchAppに用意されている「fetch」メソッドで、引数にアクセス先のアドレスを指定して呼び出すことで、そのサイトからのデータを取得できます。では簡単な利用例として、WebのURLを入力すると、そのページにアクセスし、ソースコードに含まれているURL(HTTP/HTTPSのみ)をシートにすべて書き出す、というスクリプトを考えてみましょう。
function getUrlData(){ var input = Browser.inputBox("URLを入力:"); if (input != "" & input != "cancel"){ var data = UrlFetchApp.fetch(input); var content= data.getContentText(); var arr = content.match(/(http|https):\/\/[\w.\/-?=&]+/g); var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var range = sheet.getRange(1,1,arr.length,1); for(var i = 0;i < arr.length;i++) range.getCell(i + 1, 1).setValue(arr[i]); Browser.msgBox("URLを出力しました。"); } }
Browser.inputBoxでURLを入力してもらい、それを引数に指定してUrlFetchApp.fetchを呼び出しています。このfetchで取得されるのは、「HTTPResponse」というオブジェクトです。これはアクセスして得られるHTTPレスポンスを管理するオブジェクトです。得られたHTTPResponseからデータを取得するには、以下の2つのメソッドが用意されています。
《HTTPResponse》.getContent() 《HTTPResponse》.getContentText()
getContentは、バイナリデータを各バイトごとに配列にまとめたものが返されます。getContentTextは、テキストとして値を返します。ここではgetContentTextでテキストとして取得し、それを正規表現でURLのテキスト部分だけを取り出しています。後は、SheetのgetRangeで必要な数だけセルを取得し、パターンマッチしたテキストを順に書き出すだけです。
このように、UrlFetchApp.fetchとシートの操作を組み合わせることで、外部のWebサイトから情報を収集しシートに整理するようなスクリプトが作成可能になります。スプレッドシートを、単に「ユーザーが自分でデータを書いて計算するもの」だけでなく、さまざまなデータを収集し整理するためのツールとして活用できるようになります。
Googleコンタクトの利用
GoogleのGmailなどでは、よく利用するメールアドレスなどの情報を「連絡先」として管理しています。これは「Googleコンタクト」というGoogleのサービスを利用しています。Googleコンタクトは、単にメールアドレスだけでなく、利用者の名前や住所、電話番号、誕生日などさまざまな個人情報を管理することができます。
このGoogleコンタクトの情報もGoogle Apps Scriptから利用することができます。ログインしているユーザーのGoogleコンタクトにアクセスするための「ContactsApp」というオブジェクトが用意されており、そこから必要な情報を取り出していきます。例えば、Googleコンタクトに保管されているグループやユーザーの情報を取得する場合、次のようなメソッドを利用します。
ContactsApp.getContactGroups()
全グループを配列として取得します。各グループの情報は、「ContactGroup」というオブジェクトとしてまとめられています。ここから、グループ名や、グループに保管されているユーザー情報などを得られます。
ContactsApp.getAllContacts() 《ContactGroup》.getContacts()
全ユーザーの情報を取得するには、ContactsAppの「getAllContacts」を使います。またグループに含まれているユーザーは、ContactGroupの「getContacts」を使います。いずれも、ユーザー情報を管理する「Contact」オブジェクトの配列が返されます。
これらのメソッドにより、ログインユーザーのGoogleコンタクトの情報を自由に取得できます。
では実際に簡単な例をあげましょう。Googleコンタクトからグループとそれに含まれるユーザーの情報を取得し、シートに書きだします。初めてアクセスする際、Googleコンタクトへのアクセスを許可するための認証画面がスクリプトエディタに表示されますので、ここでアクセスを許可してください。これを拒否するとデータの取得は行えません。
function getContactsData(){ var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var groups = ContactsApp.getContactGroups(); for(var i = 0;i < groups.length;i++){ var group = groups[i]; var contacts = group.getContacts(); var range = sheet.getRange(1,i + 1,contacts.length + 1,1); range.getCell(1,1).setValue(group.getGroupName()); for(var j = 0;j < contacts.length;j++){ var contact = contacts[j]; range.getCell(j + 2,1).setValue(contact.getFullName() + "\n" + contact.getPrimaryEmail()); } } }
![図12 Gmailの連絡先にアクセスし、グループごとに登録されている全ユーザー名とメールアドレスを書き出す。](http://cz-cdn.shoeisha.jp/static/images/article/5064/12.gif)
ここでは、各ユーザーの名前(フルネーム)とメインのメールアドレスだけを取得し表示してますが、それ以外の情報も同様に取り出すことは可能です。ContactsApp.getContactGroupsでContactGroupの配列を取得し、繰り返しを使ってその各グループからgetContactsでContact配列を取得します。ここでは、「getFullName」「getPrimaryEmail」というメソッドで、各Contactのフルネームとデフォルトメールアドレスを取り出してセルに書き出しています。Contactに用意されている、各種の情報を取得するためのメソッドは次のようなものがあります。
メソッド名 | 概要 |
getFullName | 名前(フルネーム)を返します。 |
getPrimaryEmail | デフォルトのメールアドレスを返します。 |
getEmailAddresses | 登録されているすべてのメールアドレスを配列で返します。 |
getHomeAddress | 自宅用メールアドレスを返します。 |
getWorkAddress | 仕事用メールアドレスを返します。 |
getPager | ページャー(ポケベル)番号を返します。 |
getHomeFax | 自宅用FAX番号を返します。 |
getWorkFax | 仕事用FAX番号を返します。 |
getHomePhone | 自宅用電話番号を返します。 |
getWorkPhone | 仕事用電話番号を返します。 |
getMobilePhone | 携帯電話番号を返します。 |
getNotes | ノート(メモ)を返します。 |
これらは、すべての項目に必ずしも値が用意されているわけではないので注意が必要です。実際に、それぞれのGmailで連絡先に登録されているデータを確認してみると分かることですが、大抵は名前とメールアドレス程度しかデータは記録されていないでしょう。