Google API 第28回

投稿者: | 2016年4月7日

今回はGoogle Drive APIの紹介をします。

Google Drive APIは最近v2からv3にバージョンが上がりました。
v3について知らない人が多いと思うので、
v2からの主な変更点と、APIの使用方法を説明していきます。

■主な変更点
・レスポンス時間の短縮
v2ではレスポンス時に全ての情報を得るため時間が掛かっていました。
v3ではその点を改善して必要最低限の情報にすることでレスポンス時間の短縮を行っているようです。

・メソッドやパラメータ、フィールドの変更・削除
v3ではメソッドやパラメータ、フィールドの名前はわかりやすいものに変更されており、
重複しているものや不必要なものは削除されています。
例えばinsertメソッドはcreateメソッドに、
patchメソッドはupdateメソッドに変更されています。

※詳しくは参考サイトのMigrate to Google Drive API v3を参照してください。

■Google Drive APIの使用方法
Google Drive APIを使用するにはGoogle Developers Consoleで
Google Drive APIを有効にし、クライアントIDを作成する必要があります。

「Google Developers Consoleの設定」「Google Drive APIの実行」の順に使用方法を説明します。

1.Google Developers Consoleでの設定
参考サイトのGoogle Developers Consoleにアクセスしプロジェクトを作成します。
そして、下記の操作を順に行います。

・Drive APIを有効にする
左メニューの【API Manager】から【概要】を選択します。
概要画面に移動したら、Drive APIを検索し有効にします。

・OAuth2のクライアントIDを作成する
左メニューの【API Manager】から【認証情報】を選択します。
認証情報画面に移動したら、【認証情報を作成】のセレクトボックスから
【OAuth2.0 クライアント ID】を選択します。

設定値
アプリケーションの種類:ウェブアプリケーション
名前:Google Fit
承認済みの JavaScript 生成元:任意のURL(例:http://localhost)
承認済みのリダイレクト URI: 任意のURL

【作成】を選択して作成完了です。

作成したクライアントIDはAPI実行時に必要になります。

2.Google Drive APIの実行
比較的実装が簡単なJavaScriptを使用します。

まずクライアントIDとスコープを指定します。
※スコープとはGoogle Driveを操作できる範囲のことです。
指定することにより許可された範囲でGoogle Driveの操作ができます。

var CLIENT_ID = 'CLIENT_ID';
// ファイルの情報を読込だけのスコープ
var SCOPE = 'https://www.googleapis.com/auth/drive.readonly';

gapi.auth.authorizeメソッドを使用して、
ユーザにGoogle Driveを操作して良いか許可を求める関数を作成します。
gapi.auth.authorizeメソッドの第1引数には許可を求めるために必要なパラメータを、
第2引数には許可された際に実行される関数を指定します。

function checkAuth() {
    gapi.auth.authorize(
    {
        'client_id': CLIENT_ID,
        'scope': SCOPE,
        'immediate': true
        'response_type': 'token'
    },  result);
}

許可された際にgapi.client.loadメソッドを用いてDrive API v3のライブラリをロードします。
gapi.client.loadメソッドの第1引数にはライブラリ名を、第2引数にはバージョンを、
第3引数にはロードされた際に実行される関数を指定します。

function result(res) {
    // v2
    gapi.client.load('drive', 'v2', list);

    // v3
    gapi.client.load('drive', 'v3', list);
}

ロードされた際にgapi.client.drive.files.listメソッドを用いて
Google Drive内のファイルの情報を取得します。

function list() {
    var req = gapi.client.drive.files.list({});
    // v2
    req.execute(function(res) {
        var files = res.items;
        for (var i = 0; i < files.length; i++) {
            var file = files[i];
            document.write(file.title + '
'); } }); // v3 req.execute(function(res) { var files = res.files; for (var i = 0; i < files.length; i++) { var file = files[i]; document.write(file.name + '
'); } }); }

※完全なコードは付録にありますのでご確認ください。

データは以下のように取得できます。

// v2
{
 "kind": "drive#fileList",
 "etag": "\"rCKCAyesbPCaBxGt0eDJcEBQNUI/PHp7VrWoHS9Nchns_nOJMvqcNxs\"",
 "selfLink": "https://www.googleapis.com/drive/v2/files",
 "items": [
  {

   "kind": "drive#file",
   "id": "1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA",
   "etag": "\"rCKCAyesbPCaBxGt0eDJcEBQNUI/MTQ1OTgyMTc5MDcxNQ\"",
   "selfLink": "https://www.googleapis.com/drive/v2/files/1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA",
   "alternateLink": "https://docs.google.com/spreadsheets/d/1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA/edit?usp=drivesdk",
   "embedLink": "https://docs.google.com/spreadsheets/d/1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA/htmlembed",
   "openWithLinks": {
    "1083656409722": "https://docs.google.com/spreadsheets/d/1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA/edit?usp=drive_web"
   },
   "defaultOpenWithLink": "https://docs.google.com/spreadsheets/d/1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA/edit?usp=drive_web",
   "iconLink": "https://ssl.gstatic.com/docs/doclist/images/icon_11_spreadsheet_list.png",
   "thumbnailLink": "https://docs.google.com/feeds/vt?gd=true&id=1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA&v=0&s=AMedNnoAAAAAVwNUHaiPwQluxg_mfl8rnfFv4dquKmXn&sz=s220",
   "title": "スプレッドシート2",
   "mimeType": "application/vnd.google-apps.spreadsheet",
   "labels": {
    "starred": false,
    "hidden": false,
    "trashed": false,
    "restricted": false,
    "viewed": true
   },
   "createdDate": "2015-04-17T06:37:33.861Z",
   "modifiedDate": "2016-04-05T02:03:10.715Z",
   "modifiedByMeDate": "2016-04-05T02:03:10.715Z",
   "lastViewedByMeDate": "2015-04-17T06:37:34.458Z",
   "markedViewedByMeDate": "1970-01-01T00:00:00.000Z",
   "version": "4367",
   "parents": [
    {

     "kind": "drive#parentReference",
     "id": "0AHlU0NaZPwRZUk9PVA",
     "selfLink": "https://www.googleapis.com/drive/v2/files/1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA/parents/0AHlU0NaZPwRZUk9PVA",
     "parentLink": "https://www.googleapis.com/drive/v2/files/0AHlU0NaZPwRZUk9PVA",
     "isRoot": true
    }
   ],
   "exportLinks": {
    "text/csv": "https://docs.google.com/spreadsheets/export?id=1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA&exportFormat=csv",
    "application/x-vnd.oasis.opendocument.spreadsheet": "https://docs.google.com/spreadsheets/export?id=1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA&exportFormat=ods",
    "application/zip": "https://docs.google.com/spreadsheets/export?id=1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA&exportFormat=zip",
    "application/pdf": "https://docs.google.com/spreadsheets/export?id=1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA&exportFormat=pdf",
    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "https://docs.google.com/spreadsheets/export?id=1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA&exportFormat=xlsx"
   },
   "userPermission": {
    "kind": "drive#permission",
    "etag": "\"rCKCAyesbPCaBxGt0eDJcEBQNUI/gYcESlN3ILHJ3UkwFKXezg2FluI\"",
    "id": "me",
    "selfLink": "https://www.googleapis.com/drive/v2/files/1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA/permissions/me",
    "role": "owner",
    "type": "user"
   },
   "quotaBytesUsed": "0",
   "ownerNames": [
    "Name"
   ],
   "owners": [
    {
     "kind": "drive#user",
     "displayName": "Name",
     "isAuthenticatedUser": true,
     "permissionId": "00000000000000000000",
     "emailAddress": "example@mail"
    }
   ],
   "lastModifyingUserName": "Name",
   "lastModifyingUser": {
    "kind": "drive#user",
    "displayName": "Name",
    "isAuthenticatedUser": true,
    "permissionId": "00000000000000000000",
    "emailAddress": "example@mail"
   },
   "editable": true,
   "copyable": true,
   "writersCanShare": true,
   "shared": false,
   "explicitlyTrashed": false,
   "appDataContents": false,
   "spaces": [
    "drive"
   ]
  },
...
}

// v3
{
 "kind": "drive#fileList",
 "files": [
  {
   "kind": "drive#file",
   "id": "1xiAS-HUqXo2I6w6rabS4I-lsFAXp5Q2kyFABPpekumA",
   "name": "スプレッドシート2",
   "mimeType": "application/vnd.google-apps.spreadsheet"
  },
...
}

v3のfiles内のデータについて説明します。
デフォルトでは1つのファイルにつき4つのフィールドしかありません。
4つのフィールドはkind、id、name、mimeTypeです。
kindはdrive#fileの文言が固定でつきます。
idはファイル固有のIDです。
nameはファイルの名前です。
mimeTypeはファイルの種類です。

Google Drive API v2とv3で使い方に差異があるのでコードを書き分けてあります。
処理の違いはライブラリのロードの仕方とレスポンス時のファイルの扱い方とレスポンス時のデータ量です。
ライブラリのロードの仕方についてですが、gapi.client.loadメソッドの第2引数にv2を指定する事でv2バージョンを、第2引数にv3を指定する事でv3バージョンのライブラリをロードすることができます。
レスポンス時のファイルの扱い方は、v2ではitemsの中に格納されているのに対し、v3ではfilesの中に格納されています。
レスポンス時のデータ量は見ていただいた通り、
v2では全データを取得していたのに対し、v3では必要最低限しかデータを取得していないのがわかります。

■レスポンス時間の短縮
レスポンス時間が短縮されているとのことなので、実際にv2とv3で比較してみます。
リクエストを1万回行う処理を1セットとし、5セット行った平均値を求め比較します。

ver 1 2 3 4 5 avg
v2 127 123 120 121 119 122
v3 91 93 94 90 92 92

(表の単位はms)

結果はv2よりv3の方が30ms速いことがわかりました。
前述したv2とv3で取得するデータ量の差が、レスポンスの速度に影響していることがわかります。

以上がGoogle Drive APIの説明です。

Google Drive APIはJavaScriptで扱えるので、
Chromeアプリとの相性が良くアプリの作成を簡単に行うことができます。
作成したChromeアプリはChromeウェブストアで配布することもできるので
興味があれば挑戦してみてはどうでしょうか。

最後に、Googleはv2とv3の両方をサポートしていくそうですが
今後のバージョンアップのことを考えてv3に移行することをお勧めします。

<参考サイト>
Google Drive API
Migrate to Google Drive API v3
Google Developers Console
Google Drive: Uploading & downloading files plus the new v3 API redux

<付録>
Google Driveのファイル名を書き出す簡単なサンプル
※使用する際はCLIENT_IDを自身で作成したクライアントIDに置き換えてください。

<html>
  <head>
    <script type="text/javascript">
    var CLIENT_ID = 'CLIENT_ID';

    var SCOPES = ['https://www.googleapis.com/auth/drive.readonly'];

    function checkAuth() {
        gapi.auth.authorize(
        {
            client_id: CLIENT_ID,
            scope: SCOPES,
            immediate: true,
        },  result);
    }

    function result(res) {
        // v2
        gapi.client.load('drive', 'v2', list);

        // v3
        gapi.client.load('drive', 'v3', list);
    }

    function click(event) {
        gapi.auth.authorize(
        {
            client_id: CLIENT_ID,
            scope: SCOPES,
            immediate: false,
        },  result);
        return false;
    }

    function list() {
        var req = gapi.client.drive.files.list({});
        
        // v2
        req.execute(function(res) {
            var files = res.items;
            for (var i = 0; i < files.length; i++) {
                var file = files[i];
                document.write(file.title + '
'); } }); // v3 req.execute(function(res) { var files = res.files; for (var i = 0; i < files.length; i++) { var file = files[i]; document.write(file.name + '
'); } }); } </script> <script src="https://apis.google.com/js/client.js?onload=checkAuth"> </script> </head> <body> <div id="authorize-div" style="display: none"> <span>Authorize access to Drive API <div id="output">