Google API 第31回

投稿者: | 2016年6月1日

前回に引き続き、Google Drive APIについてです。
今回はRevisionsとPermissionsを用いたリクエストについて紹介します。

■Revisions
Revisionsを用いたリクエストでは、ファイルのリビジョンを管理することができます。

○リクエストと結果
Revisionsを用いてリクエストをするには下記のメソッドを使用します。
gapi.client.drive.revisions.update()・・・リビジョンを更新
gapi.client.drive.revisions.delete()・・・リビジョンを削除
gapi.client.drive.revisions.list()・・・リビジョンを一覧で取得
gapi.client.drive.revisions.get()・・・リビジョンを取得

・updateの場合
gapi.client.drive.revisions.update()を使う場合、更新したいリビジョンがあるファイルのfileIdと
更新したいリビジョンのrevisionId、更新したい内容、リクエスト結果を取得するためのfieldsが必要になります。
gapi.client.drive.revisions.update({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’, ‘revisionId’ : ‘YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY’, ‘published’ : false, ‘fields’: ‘id, mimeType’});

リクエスト結果は下記の通りです。
updateに関しては目視で変わったとわからないので省略します。

・deleteの場合
gapi.client.drive.revisions.delete()を使う場合、削除したいリビジョンがあるファイルのfileIdと
削除したいリビジョンのrevisionIdが必要になります。
gapi.client.drive.revisions.delete({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’, ‘revisionId’ : ‘YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY’});

リクエスト結果は下記の通りです。
赤で囲んでいる部分にあったリビジョンがなくなっているのがわかります。
google_api31-1

・listの場合
gapi.client.drive.revisions.list()を使う場合、リビジョンの一覧を取得するファイルのfileIdと
リクエスト結果を取得するためのfieidsが必要になります。
gapi.client.drive.revisions.list({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’, ‘fieids’ : ‘id, mimeType’});
fieidsを指定しないリクエストも行うこともできます。
その場合のリクエスト結果はkind、revisions[].kind、revisions[].id、
revisions[].mimeType、revisions[].modifiedTimeのみの情報となります。
gapi.client.drive.revisions.list({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’});

全てのフィールドを指定したリクエストの結果は下記の通りです。
リビジョンの情報はrevisionsに格納されています。
revisions[].kindは常にdrive#revisionという文言です。
revisions[].idはリビジョンのIDです。リビジョンの更新、削除に使用されます。
revisions[].modifiedTimeはリビジョンが更新された日付です。
revisions[].keepForeverはリビジョンを永久に保持しておくかどうかを示します。
設定しない場合、リビジョンは30日後に削除されます。
revisions[].publishedはリビジョンが公開されているかどうかを示します。Googleドキュメントにのみ適用されます。
revisions[].lastModifyingUser.kindは常にdrive#userという文言です。
revisions[].lastModifyingUser.displayNameはリビジョンを更新したユーザーの名前です。
revisions[].lastModifyingUser.photoLinkはリビジョンを更新したユーザーの写真へのリンクです。
revisions[].lastModifyingUser.meはリビジョンをリビジョンを更新したユーザーが本人であるかどうかを示します。
revisions[].lastModifyingUser.permissionIdはリビジョンを更新したユーザーのIDです。
revisions[].lastModifyingUser.emailAddressはリビジョンを更新したユーザーのメールアドレスです。
revisions[].originalFilenameは元のファイル名です。
revisions[].md5ChecksumはリビジョンのMD5チェックサムです。
revisions[].sizeはリビジョンのファイルサイズです。

{
 "kind": "drive#revisionList",
 "revisions": [
  {
   "kind": "drive#revision",
   "id": "0B3lU0NaZPwRZV2tETWs4cTVRSHBVU0JPT0hYV00xTVNqxxxxxx",
   "mimeType": "application/octet-stream",
   "modifiedTime": "2016-05-17T06:29:30.424Z",
   "keepForever": false,
   "published": false,
   "lastModifyingUser": {
    "kind": "drive#user",
    "displayName": "○○○○",
    "photoLink": "https://lh4.googleusercontent.com/-yQ6I-0rupAw/AAAAAAAAAAI/AAAAAAAAABo/xxxxxxxxxxx/xxx/photo.jpg",
    "me": true,
    "permissionId": "07416298343336xxxxxx",
    "emailAddress": "xxxxxx@gmail.com"
   },
   "md5Checksum": "d41d8cd98f00b204e9800998ecxxxxxx",
   "size": "0"
  },
  {
   "kind": "drive#revision",
   "id": "0B3lU0NaZPwRZenByZTJjakJpVTY2Skc2clBtdmhudk1oxxxxxx",
   "mimeType": "application/octet-stream",
   "modifiedTime": "2016-05-18T01:04:48.305Z",
   "keepForever": true,
   "published": false,
   "lastModifyingUser": {
    "kind": "drive#user",
    "displayName": "○○○○",
    "photoLink": "https://lh4.googleusercontent.com/-yQ6I-0rupAw/AAAAAAAAAAI/AAAAAAAAABo/xxxxxxxxxxx/xxx/photo.jpg",
    "me": true,
    "permissionId": "07416298343336xxxxxx",
    "emailAddress": "xxxxxx@gmail.com"
   },
   "originalFilename": "test",
   "md5Checksum": "0cc175b9c0f1b6a831c399e269xxxxxx",
   "size": "1"
  }
 ]
}

・getの場合
gapi.client.drive.revisions.get()を使う場合、取得したいリビジョンがあるファイルのfileIdと
取得したいリビジョンのrevisionId、リクエスト結果を取得するためのfieidsが必要になります。
gapi.client.drive.revisions.get({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’, ‘revisionId’ : ‘YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY’, ‘fields’: ‘id, mimeType’});
fieidsを指定しないリクエストも行うこともできます。
その場合のリクエスト結果はkind、id、mimeType、modifiedTimeのみの情報となります。
gapi.client.drive.revisions.list({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’});

全てのフィールドを指定したリクエストの結果は下記の通りです。
取得した情報はlistで取得したrevisions[]の内容と同じなので説明を省きます。

{
 "kind": "drive#revision",
 "id": "0B3lU0NaZPwRZV2tETWs4cTVRSHBVU0JPT0hYV00xTVNqxxxxxx",
 "mimeType": "application/octet-stream",
 "modifiedTime": "2016-05-17T06:29:30.424Z",
 "keepForever": false,
 "published": false,
 "lastModifyingUser": {
  "kind": "drive#user",
  "displayName": "○○○○",
  "photoLink": "https://lh4.googleusercontent.com/-yQ6I-0rupAw/AAAAAAAAAAI/AAAAAAAAABo/xxxxxxxxxxx/xxx/photo.jpg",
  "me": true,
  "permissionId": "07416298343336xxxxxx",
  "emailAddress": "xxxxxx@gmail.com"
 },
 "md5Checksum": "d41d8cd98f00b204e9800998ecxxxxxx",
 "size": "0"
}

■Permissions
Permissionsを用いたリクエストでは、ファイルのユーザー権限を管理することができます。

○リクエストと結果
Permissionsを用いてリクエストをするには下記のメソッドを使用します。
gapi.client.drive.permissions.create()・・・ファイルにユーザー権限を作成
gapi.client.drive.permissions.update()・・・ファイルのユーザー権限を更新
gapi.client.drive.permissions.delete()・・・ファイルのユーザー権限を削除
gapi.client.drive.permissions.list()・・・ファイルのユーザー権限を一覧で取得
gapi.client.drive.permissions.get()・・・ファイルのユーザー権限を取得

・createの場合
gapi.client.drive.permissions.create()を使う場合、ユーザー権限を作成するファイルのfileIdと
、ユーザーのrole、ユーザーのtype、ユーザーのemailAddress、リクエスト結果を取得するためのfieidsが必要になります。
ユーザーのroleにはでwitter(編集者)、commenter(コメント可)、reader(閲覧者)が指定できます。
ユーザーのtypeにはuser、group、domain、anyoneが指定できます。
gapi.client.drive.permissions.create({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’, ‘role’: ‘writer’, ‘type’: ‘user’, ‘emailAddress’: ‘xxxxxx@gmail.com’, ‘fields’: ‘id, type’});
fieidsを指定しないリクエストも行うこともできます。
その場合のリクエスト結果はkind、id、type、roleのみの情報となります。
gapi.client.drive.permissions.create({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’, ‘role’: ‘writer’, ‘type’: ‘user’, ‘emailAddress’: ‘xxxxxx@gmail.com’});

リクエストの結果は下記の通りです。
赤で囲んでいる部分はリクエスト時で作成したユーザー権限です。
google_api31-2

・updateの場合
gapi.client.drive.permissions.update()を使う場合、更新したいユーザー権限があるファイルのfileIdと
ユーザーのpermissionIdと更新したい内容、リクエスト結果を取得するためのfieidsが必要になります。
gapi.client.drive.permissions.update({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’, ‘permissionId’: ‘YYYYYYYYYYYYYYYYYYYY’,’role’: ‘commenter’, ‘fields’: ‘id, type’});
fieldsを指定しないリクエストも行うこともできます。
その場合のリクエスト結果はkind、id、type、roleのみの情報となります。
gapi.client.drive.permissions.create({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’, ‘permissionId’: ‘YYYYYYYYYYYYYYYYYYYY’,’role’: ‘commenter’});

リクエスト結果は下記の通りです
赤で囲んでいる部分はリクエスト時で更新したユーザー権限です。
※createで作成したユーザー権限をupdateしています。
google_api31-3

・deleteの場合
gapi.client.drive.permissions.delete()を使う場合、削除したいユーザー権限があるファイルのfileIdとユーザーのpermissionIdが必要になります。
gapi.client.drive.permissions.delete({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’, ‘permissionId’: ‘YYYYYYYYYYYYYYYYYYYY’});

リクエスト結果は下記の通りです。
赤で囲んでいる部分はリクエスト時に削除されたユーザー権限です。
ユーザー権限が消えているのがわかると思います。
※updateで更新したユーザー権限をdeleteしています。
google_api31-4

・listの場合
gapi.client.drive.permissions.list()を使う場合、リビジョンの一覧を取得するファイルのfileIdと
リクエスト結果を取得するためのfieidsが必要になります。
gapi.client.drive.permissions.list({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’, ‘fieids’ : ‘id, type’});
fieidsを指定しないリクエストも行うこともできます。
その場合のリクエスト結果はkind、permissions[].kind、permissions[].id、permissions[].type、permissions[].roleのみの情報となります。
gapi.client.drive.permissions.list({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’});

全てのフィールドを指定したリクエストの結果は下記の通りです。
コメントの情報はpermissionsに格納されています。
permissions[].kindは常にdrive#permissionという文言です。
permissions[].idはユーザーのIDです。権限の更新、削除に使用されます。
permissions[].typeはユーザーのタイプです。
タイプにはuser、group、domain、anyoneがあります。
permissions[].emailAddressはユーザーのメールアドレスです。
permissions[].roleはユーザーの役割です。
役割にはowner(作成者)、writer(編集者)、commenter(コメント可)、reader(閲覧者)があります。
permissions[].displayNameはユーザーの名前です。
permissions[].photoLinkはユーザーの写真へのリンクです。

{
 "kind": "drive#permissionList",
 "permissions": [
  {
   "kind": "drive#permission",
   "id": "07416298343336xxxxxx",
   "type": "user",
   "emailAddress": "xxxxxx@gmail.com",
   "role": "owner",
   "displayName": "○○○○",
   "photoLink": "https://lh4.googleusercontent.com/-yQ6I-0rupAw/AAAAAAAAAAI/AAAAAAAAABo/xxxxxxxxxxx/xxx/photo.jpg"
  },
  {
   "kind": "drive#permission",
   "id": "07775624081877yyyyyy",
   "type": "user",
   "emailAddress": "yyyyyy@gmail.com",
   "role": "writer",
   "displayName": "××××"
  }
 ]
}

・getの場合
gapi.client.drive.permissions.get()を使う場合、取得したいリビジョンのファイルのfileIdと
取得したいリビジョンのpermissionIdとリクエスト結果を取得するためのfieidsが必要になります。
取得するファイルのfileIdとfieldsが1つ以上必要になります。
gapi.client.drive.permissions.get({‘fileId’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXX’, ‘permissionId’: ‘YYYYYYYYYYYYYYYYYYYY’, ‘fields’: ‘id, type’});

全てのフィールドを指定したリクエストの結果は下記の通りです。
取得した情報はlistで取得したpermissions[]の内容と同じなので説明を省きます。

{
   "kind": "drive#permission",
   "id": "07416298343336xxxxxx",
   "type": "user",
   "emailAddress": "xxxxxx@gmail.com",
   "role": "owner",
   "displayName": "○○○○",
   "photoLink": "https://lh4.googleusercontent.com/-yQ6I-0rupAw/AAAAAAAAAAI/AAAAAAAAABo/xxxxxxxxxxx/xxx/photo.jpg"
}

以上がRevisionsとPermissionsを用いたリクエストの仕方です。

リビジョン管理のRevisionsについてですが、
普段はあまり使わない機能なので頭の片隅にでも置いておいてください。

ユーザー権限を管理するPermissionsについてですが、社内で共有したいファイルがあるときに
ユーザーのメールアドレスのみで簡単に権限(編集者・コメント可・閲覧者)を与えることができるので便利です。

次回は、Google Drive APIのChangesとアップロードなどについて紹介します。
※次回紹介する予定だったChannelは用途が特殊なので省略します。

<参考サイト>
・Google Drive APIのリファレンス
・APIs Explorer Drive API v3

<付録>
・ファイルのリビジョンとファイルの権限を管理するための簡単なサンプル
※使用する際はCLIENT_IDを自身で作成したクライアントIDに置き換えてください。
またFILE_ID、REVISION_ID、PERMISSION_IDも置き換えて使用してください。
※コメントアウトしている部分は作成、更新、削除、取得を行うためのメソッドです。
必要に応じてアンコメントしてください。

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

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

    function checkAuth() {
        gapi.auth.authorize(
        {
            client_id: CLIENT_ID,
            scope: SCOPES,
            immediate: true,
        },  authResult);
    }
    
    function authResult(authResult) {
        var authorizeDiv = document.getElementById('authorize-div');
        if (authResult && !authResult.error) {
            authorizeDiv.style.display = 'none';
            loadAPI();
        }   
        else {
            authorizeDiv.style.display = 'inline';
        }
    }
    function loadAPI() {
        gapi.client.load('drive', 'v3', request);
    }

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

    function request() {

        var fileId = FILE_ID;
        var revisionId = REVISION_ID;
        var permissionId = PERMISSION_ID;
        var req = '';

        // リビジョンを更新
        //req = gapi.client.drive.revisions.update({'fileId': fileId, 'revisionId': revisionId, 'publishAuto': false, 'fields': 'id, mimeType'});
        // リビジョンを削除
        //req = gapi.client.drive.revisions.delete({'fileId': fileId, 'revisionId': revisionId});
        // リビジョンを一覧で取得
        req = gapi.client.drive.revisions.list({'fileId': fileId});
        // リビジョンを取得
        //req = gapi.client.drive.revisions.get({'fileId': fileId, 'revisionId': revisionId});
        
        // リビジョンの更新、取得用
        /*req.execute(function(res) {
                console.log(res);
                document.write(res.id + '
'); document.write(res.mimeType + '
'); document.write(res.modifiedTime + '
'); });*/ // リビジョンの一覧取得用 req.execute(function(res) { var revisions = res.revisions; for(i=0; i'); document.write(revisions[i].mimeType + '
'); document.write(revisions[i].modifiedTime + '
'); } }); // ファイルのユーザー権限を作成 //req = gapi.client.drive.permissions.create({'fileId': fileId, 'role': 'writer', 'type': 'user', 'emailAddress': 'xxxxxx@gmail.com', 'fields': 'id, type'}); // ファイルのユーザー権限を更新 //req = gapi.client.drive.permissions.update({'fileId': fileId, 'permissionId': permissionId, 'role': 'commenter', 'fields': 'id, type'}); // ファイルのユーザー権限を削除 //req = gapi.client.drive.permissions.delete({'fileId': fileId, 'permissionId': permissionId}); // ファイルのユーザー権限を一覧で取得 req = gapi.client.drive.permissions.list({'fileId': fileId, 'fieids' : 'id, type'}); // ファイルのユーザー権限を取得 //req = gapi.client.drive.permissions.get({'fileId': fileId, 'permissionId': permissionId, 'fields': 'id, type'}); // ファイルのユーザー権限の作成、更新、取得用 /*req.execute(function(res) { console.log(res); document.write(res.id + '
'); document.write(res.type + '
'); });*/ // ファイルのユーザー権限の一覧取得用 req.execute(function(res) { var permissions = res.permissions; for(i=0; i'); document.write(permissions[i].type + '
'); } }); } </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</span> <button id="authorize-button" onclick="authClick(event)"> Authorize </button> </div> <pre id="output"></pre> </body> </html>