プロジェクトのインポートとエクスポート

Google Apps Script プロジェクトは Google ドライブに保存されるため、デベロッパーは Google Drive APIドライブ サービスと混同しないようにしてください)を使用して Apps Script のソースコードをインポートおよびエクスポートできます。

たとえば、デベロッパーは、お気に入りのコードエディタを使用してローカルマシンで新しい Apps Script コードを作成し、Git などのバージョン管理システムを使用して他のデベロッパーと共同作業できます。バージョンが完成したら、REST API を使用してファイルを Google ドライブにアップロード(インポート)できます。アップロードしたファイルは、他の Apps Script プロジェクトと同様に使用できます。

コードの変更はローカル バージョンで行い、Google Drive API を使用して Apps Script プロジェクトに同期できます。既存のプロジェクトは、Google ドライブからローカルマシンにダウンロード(エクスポート)できます。

機能と制限事項

Google Drive API を使用してプロジェクトをインポートまたはエクスポートする場合は、次の点に注意してください。

  1. サーバーサイド スクリプト ファイルは「.gs」で終わる必要があります。.js ファイルを使用してローカルで開発できますが、Google ドライブにインポートする前に、.gs 拡張子を含むように名前を変更してください。
  2. クライアントサイド スクリプト ファイルは「.html」で終わる必要があります。これには、クライアントサイドの .html、.js、.css ファイルが含まれます。他の拡張子を使用してローカルで開発できますが、Google ドライブにインポートする前に .html 拡張子を付けることが重要です。
  3. プロジェクト ファイルを Google ドライブにインポートすると、それらのファイル内の既存のデータはすべて上書きされます。 テキストの一部を追加または挿入することはできません。ファイル全体を更新する必要があります。
  4. サーバーサイド スクリプト ファイルには有効な JavaScript が含まれている必要があります。サーバーの .js ファイルにエラーがある場合、Google Drive API の更新呼び出しは 5xx エラーで失敗します。インポートする前にコードを lint チェックすることで、これを防ぐことができます。
  5. 空のファイルはインポートできません。空のファイルをアップロードしようとすると、Google Drive API の更新呼び出しは 5xx エラーで失敗します。
  6. インポートまたはエクスポートできるのはスタンドアロン スクリプトのみです。コンテナ バインド スクリプトには、Google Drive API を介してアクセスできません。
  7. インポートまたはエクスポートできるのはソースコードのみです。プロジェクト プロパティやログなどのリソースも、Google Drive API では公開されません。Google Drive API を使用して、スクリプトのバージョン管理、公開、実行などの操作を行うことはできません。
  8. 1 つのサーバー Code.gs ファイルに限定されません。開発を容易にするために、サーバーコードを複数のファイルに分散できます。すべてのサーバー ファイルは同じグローバル名前空間に読み込まれるため、安全なカプセル化を行う場合は JavaScript クラスを使用します。

Drive API

Google Drive API を使用すると、デベロッパーは Google ドライブ内のファイルにプログラムでアクセスできます。この API は、GET を使用してファイルをダウンロードし、PUT/POST を使用してファイルをアップロードします。詳細なドキュメントとクイックスタートについては、Google Drive API の概要ページをご覧ください。

このガイドでは、次の呼び出しを使用して Files リソース でファイルを一覧表示して移動する方法について説明します。

承認

Google Drive API へのすべてのリクエストは、OAuth 2.0 プロトコルを使用して認証されたユーザーによって承認される必要があります。詳細については、 Google Drive API の承認に関するドキュメントをご覧ください。

アプリケーションに必要な他のスコープhttps://www.googleapis.com/auth/drive など)に加えて、Google Apps Script プロジェクトをインポートまたはエクスポートしようとするすべてのアプリケーションは、特別なスコープをリクエストする必要があります。

https://www.googleapis.com/auth/drive.scripts

次のサンプル リクエストをテストするには、OAuth 2.0 Playground から取得した OAuth 2.0 ベアラートークンを使用します。

既存のプロジェクトを一覧表示する

ドライブ内のすべての Apps Script プロジェクトを一覧表示するには、 Files リソースを使用して、 MIME タイプが application/vnd.google-apps.script のファイルをクエリします。レスポンスを 自分が所有するファイルのみに絞り込むには、検索パラメータ 'me' in owners を含めます。

JSON レスポンスで返される Apps Script プロジェクトの配列を示すリクエストとレスポンスの例を次に示します。

GET https://www.googleapis.com/drive/v2/files?q=mimeType%3D'application%2Fvnd.google-apps.script'+and+'me'+in+owners
Authorization:  Bearer ya29.fakebearerstring
{
 "kind": "drive#fileList",
 "etag": "\"kjsas92/f3zGUXczKMxEB_9ZTMRFOF3d1ZU\"",
 "selfLink": "https://www.googleapis.com/drive/v2/files?q=mimeType%3D'application/vnd.google-apps.script'+and+'me'+in+owners",
 "items": [
  {
   "kind": "drive#file",
   "id": "1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D",
   "etag": "\"kjsas92/MTM3MDk3ODY5ODQyNg\"",
   "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D",
   "alternateLink": "https://script.google.com/a/google.com/d/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/edit?usp=drivesdk",
   "iconLink": "https://ssl.gstatic.com/docs/doclist/images/icon_11_script_list.png",
   "title": "Mail merge",
   "mimeType": "application/vnd.google-apps.script",
   "description": "",
   "labels": {
    "starred": false,
    "hidden": false,
    "trashed": true,
    "restricted": false,
    "viewed": true
   },
   "createdDate": "2013-06-11T19:24:45.188Z",
   "modifiedDate": "2013-06-11T19:24:58.426Z",
   "modifiedByMeDate": "2013-06-11T19:24:58.426Z",
   "lastViewedByMeDate": "2013-06-11T19:24:58.426Z",
   "parents": [
    {
     "kind": "drive#parentReference",
     "id": "0APdyIOzo7bWDUk9PVA",
     "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/parents/0APdyIOzo7bWDUk9PVA",
     "parentLink": "https://www.googleapis.com/drive/v2/files/0APdyIOzo7bWDUk9PVA",
     "isRoot": true
    }
   ],
   "exportLinks": {
    "application/json": "https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json"
   },
   "userPermission": {
    "kind": "drive#permission",
    "etag": "\"kjsas92/259X2r5DVstv1CcIQTjt_RQPSW8\"",
    "id": "me",
    "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/permissions/me",
    "role": "owner",
    "type": "user"
   },
   "quotaBytesUsed": "0",
   "ownerNames": [
    "John Doe"
   ],
   "owners": [
    {
     "kind": "drive#user",
     "displayName": "John Doe",
     "picture": {
      "url": "https://lh4.googleusercontent.com/-yd1rIb6Pe2Y/AAAAAAAAAAI/AAAAAAAAAGs/PP5vTuZonik/s64/photo.jpg"
     },
     "isAuthenticatedUser": true,
     "permissionId": "1234566789"
    }
   ],
   "lastModifyingUserName": "John Doe",
   "lastModifyingUser": {
    "kind": "drive#user",
    "displayName": "John Doe",
    "picture": {
     "url": "https://lh4.googleusercontent.com/-yd1rIb6Pe2Y/AAAAAAAAAAI/AAAAAAAAAGs/PP5vTuZonik/s64/photo.jpg"
    },
    "isAuthenticatedUser": true,
    "permissionId": "1234566789"
   },
   "editable": true,
   "writersCanShare": true,
   "shared": false,
   "explicitlyTrashed": true,
   "appDataContents": false
  }
 ]
}

Apps Script プロジェクトのファイル ID がわかっている場合は、次の API 呼び出しで直接取得できます。

GET https://www.googleapis.com/drive/v2/files/1234567890abcefghijklmnopqrstuvwxyz
Authorization:  Bearer ya29.fakebearerstring

プロジェクトのファイル ID はプロジェクト キーと同じではありません。ファイル ID は、プロジェクトの URL に含まれる英数字の文字列です。

ドライブからプロジェクトをエクスポートする

API から File リソースを取得すると、exportLinks プロパティに、プロジェクトの内容を JSON データとして取得するための URL が含まれます。この URL の例を次に示します。

https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json

この URL にリクエストを送信して、プロジェクト自体の内容を取得します。 同じ OAuth Bearer トークンを含む Authorization ヘッダーを含めます。

リクエストとレスポンスの例を次に示します。

GET https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json
Authorization:  Bearer ya29.fakebearerstring
{
  "files": [
    {
      "id":"9basdfbd-749a-4as9b-b9d1-d64basdf803",
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "id":"3asf7c0d-1afb-4a9-8431-5asdfc79e7ae",
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    Hello, world!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}

上記の例には、HTML Service ガイドのウェブアプリのコードが含まれています。Files の配列が返されます。各配列には次の 4 つのプロパティがあります。

id プロジェクト内のファイルの内部識別子。更新時にこのファイルを参照するために必要です。
name スクリプト エディタに表示される、拡張子のないファイルの名前。
type ファイルの種類は server_js と html の 2 つです。
source ファイルに含まれるエンコードされたソースコード。

ドライブにプロジェクトをインポートする

既存のプロジェクトを更新するには、適切な fileId を指定してファイル update API に HTTP PUT 呼び出しを行います。 次の例は、メディア アップロード部分のトランザクションの例を示しています。クライアント ライブラリのいずれかを使用すると、メタデータとメディアを同じアップロード呼び出しに簡単に含めることができます。Content-Type ヘッダーは、このケースでアップロードされるコンテンツのタイプを指定します。

PUT https://www.googleapis.com/upload/drive/v2/files/1234567890abcefghijklmnopqrstuvwxyz
Authorization:  Bearer ya29.fakebearerestring
Content-Type:  application/vnd.google-apps.script+json
{
  "files": [
    {
      "id":"9basdfbd-749a-4as9b-b9d1-d64basdf803",
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "id":"3asf7c0d-1afb-4a9-8431-5asdfc79e7ae",
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    New message!!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}

プロジェクト内に新しいファイルを作成する

プロジェクト内に新しいファイルを作成するには、id プロパティのないファイルに対して PUT リクエストを送信します。不明な識別子を持つファイルを含めると、エラー メッセージが表示されます。

プロジェクト内のファイルを削除する

プロジェクトからファイルを削除するには、そのファイルを含まない(プロジェクト内の他のすべてのファイルを含む)PUT リクエストを送信します。インポート プロセス中に返送されないファイルは、サーバーから削除されます。

プロジェクト内のファイルの名前を変更する

プロジェクト内のファイルの名前を変更するには、既存の id と新しい name を指定して PUT リクエストを送信します。サーバーは、type への変更を試みても無視します。

新しいプロジェクトを作成

新しいプロジェクトを作成するには、ファイル insert API に POST リクエストを送信します。update 呼び出しと同様に、クライアント ライブラリを使用して、プロジェクト名や説明などのメタデータを含めることができます。

メディア アップロードのトランザクションの例を次に示します。これにより、ドライブに「Untitled」というプロジェクトが作成されます。URL の convert パラメータは必須です。update 呼び出しと同様に、Content-Type ヘッダーが必要です。

POST https://www.googleapis.com/upload/drive/v2/files?convert=true
Authorization:  Bearer ya29.fakebearerestring
Content-Type:  application/vnd.google-apps.script+json
{
  "files": [
    {
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    Hello, world!!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}