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

Apps Script プロジェクトは Google ドライブに存在するため、デベロッパーは Google Drive API(Apps Script の Drive サービスと混同しないようにしてください)を使用して 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 ドライブ API の更新呼び出しは 5xx エラーで失敗します。これを防ぐには、インポートする前にコードをリントします。
  5. 空のファイルはインポートできません。空のファイルをアップロードしようとすると、Google ドライブ API の更新呼び出しが 5xx エラーで失敗します。
  6. インポートまたはエクスポートできるのは、スタンドアロン スクリプトのみです。コンテナバインド スクリプトには、Google Drive API を介してアクセスできません。
  7. インポートまたはエクスポートできるのはソースコードのみです。プロジェクトのプロパティやログなどのリソースも、Google ドライブ API を介して公開されません。Google ドライブ 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

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

ドライブ内のすべての Apps Script プロジェクトを一覧表示するには、ファイル リソースを使用して、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 サービス ガイドの簡単なウェブアプリのコードが含まれています。Files の配列が返されます。各 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 への変更を無視します。

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

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

メディア アップロードのトランザクションの例を次に示します。これにより、ドライブに「無題」というプロジェクトが作成されます。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"
    }
  ]
}