Apps Script プロジェクトは Google ドライブ上にあるため、デベロッパーは Google Drive API を使用して Apps Script のソースコードをインポートおよびエクスポートできます(Apps Script のドライブ サービスとは異なります)。
たとえば、デベロッパーはお気に入りのコードエディタを使用してローカルマシンで新しい Apps Script コードを作成し、Git のようなバージョン管理システムを使用して他のデベロッパーと共同で作業できます。バージョンが確定したら、REST API を使用して Google ドライブにファイルをアップロード(インポート)し、他の Apps Script プロジェクトと同じように使用できます。
ローカル バージョンでコードを変更し、Google Drive API を使用して Apps Script プロジェクトと同期できます。既存のプロジェクトは、Google ドライブからローカルマシンにダウンロード(エクスポート)できます。
機能と制限事項
Google Drive API を使用してプロジェクトをインポートまたはエクスポートする場合は、次の点に注意してください。
- サーバーサイド スクリプト ファイルは、末尾が「.gs」である必要があります。.js ファイルを使ってローカルで開発することもできますが、Google ドライブにインポートする前に、拡張子が .gs になるよう名前を変更してください。
- クライアント側のスクリプト ファイルは、末尾が「.html」である必要があります。これには、クライアントサイドの .html、.js、.css ファイルが含まれます。前述のとおり、他の拡張機能を使用してローカルで開発することもできますが、Google ドライブにインポートする前に .html 拡張子を追加しておくことが重要です。
- プロジェクト ファイルを Google ドライブにインポートすると、そのファイル内の既存のデータがすべて上書きされます。テキストの一部を追加または挿入することはできません。ファイル全体を更新する必要があります。
- サーバーサイドのスクリプト ファイルには、有効な JavaScript を含める必要があります。サーバーの .js ファイルにエラーがある場合、Google Drive API の更新呼び出しは 5xx エラーで失敗します。これを防ぐには、インポート前にコードを lint チェックします。
- 空のファイルはインポートできません。空のファイルをアップロードしようとすると、Google Drive API の更新呼び出しが 5xx エラーで失敗します。
- スタンドアロン スクリプトのみをインポートまたはエクスポートできます。コンテナにバインドされたスクリプトには、Google Drive API でアクセスできません。
- インポートまたはエクスポートできるのはソースコードのみです。プロジェクト プロパティやログなどのリソースも Google Drive API を介して公開されません。スクリプトのバージョニング、スクリプトの公開、実行などのアクションは、Google Drive API を介して実行できません。
- 使用できるサーバーは 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 の承認に関するドキュメントをご覧ください。
Google Apps Script プロジェクトをインポートまたはエクスポートしようとするすべてのアプリは、アプリケーションが必要とする可能性のある他のスコープ(https://www.googleapis.com/auth/drive
など)のほかに、以下の特別なスコープをリクエストする必要があります。
https://www.googleapis.com/auth/drive.scripts
既存のプロジェクトを一覧表示する
ドライブ内のすべての 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
ドライブからプロジェクトをエクスポートする
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 サービスガイドからシンプルなウェブアプリ用のコードが含まれています。それぞれ次の 4 つのプロパティを持つ Files
の配列が返されることに注意してください。
id |
プロジェクト内のファイルの内部識別子。更新時にこのファイルを参照するために必要です。 |
name |
スクリプト エディタに表示される、拡張子のないファイルの名前。 |
type |
ファイルは server_js と html の 2 種類です。 |
source |
ファイルに含まれるエンコードされたソースコード。 |
ドライブへのプロジェクトのインポート
既存のプロジェクトを更新するには、適切な fileId
を使用して update
ファイル API を HTTP PUT
で呼び出します。以下の例は、メディアのアップロード部分のサンプル トランザクションを示しています。クライアント ライブラリのいずれかを使用すると、1 回のアップロード呼び出しでメタデータとメディアを簡単にアップロードできます。この場合、アップロードされるコンテンツのタイプは 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
を指定して PUT
リクエストを送信しますが、新しい name
も指定します。サーバーは 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" } ] }