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

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 を使用してプロジェクトをインポートまたはエクスポートする場合は、次の点に注意してください。

  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. サーバー Code.gs ファイルは 1 つに限定されません。サーバーコードを複数のファイルに分散して、開発を容易にできます。すべてのサーバー ファイルは同じグローバル名前空間に読み込まれるため、安全なカプセル化を行う場合は 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

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

ドライブ内のすべての 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 Service ガイドのシンプルなウェブアプリのコードが含まれています。Files の配列が返されます。各配列には、
の 4 つのプロパティが含まれています。

id プロジェクト内のファイルの内部 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"
    }
  ]
}