Google Apps Scriptのプロジェクトのコードを外部からダウンロード/アップロード(ダウンロード編)

# Google Apps Scriptのプロジェクトのコードを外部からダウンロード/アップロード(ダウンロード編)

※なんとなく難しくない言葉で優し目に書いています。

Google Appsのマクロ環境であるGoogle Apps ScriptのプロジェクトのコードをGoogle Drive APIを利用して、
外部からダウンロード/アップロード出来るようになりました！

今回はその話について書いてきます。


## ドキュメントとか説明動画

ドキュメントは以下にあります。
英語がイケる人はこれを読めばいいです。

__リファレンス__
[Google Apps Script Reference#Import/Export](https://developers.google.com/apps-script/import-export#import_projects)

また英語が更にいける方は、Google Developer Liveで放送された、Youtubeを見るといいと思います。

__Youtube Google Developer Live__
[Apps Script Crush Course: Import/Export Apps Script Code](https://www.youtube.com/watch?v=lEVMu9KE6jk)

## 何ができるの?

Google Apps Scriptのプロジェクトのコードをローカル環境にダウンロードしたり、
ローカル環境で作成したコードを、既存のGASプロジェクトのコードに反映したり、新しいGASのプロジェクトを作成したりできます。

また既存のGASプロジェクトのファイルを追加したり、削除したり、名称を変更したりもできます。

## ダウンロード(Export) 

ダウンロードは3つのやり方があります。
すべての方法でjson形式でファイルがダウンロード(Export)できます。

### 1. 簡単なやり方

最も簡単にコードをダウンロードするには以下のURLにアクセスします。


`https://script.google.com/feeds/download/export?id={Script Editorを開いた時にURLに記載されたID(DriveのFile ID)}&format=json`
または
`https://script.google.com/feeds/download/export?id={プロジェクトID}&format=json`

### 2. Drive API経由で取得

Google Drive APIのdrive.file.get APIを利用して、上記のURLを取得する方法です。
この方法は他のプログラム(例えばローカル環境のエディタや、独自サービス)から取得する場合に利用できます。

Google APIは簡単にブラウザ上から試せるので、今回はその方法で試してみます。


#### ダウンロード用のURLを取得

1. __API Explorerを開く__
    以下の何れかにアクセスします。
    [Google API Explorer#drive.files.get](https://developers.google.com/drive/v2/reference/files/get)
    [Google Drive API Reference#files.get](https://developers.google.com/drive/v2/reference/files/get)

1. __File IDの入力__
    いくつか入力欄があると思うので、`fileId`にScript Editorを開いた時にURLに記載されたIDを入力します。
    ※下のリンクを開いた方、開いたページの下の方に入力欄があります。

1. __認可(ログインみたいなもの)__
    入力欄の左上に`Authorize requests using OAuth 2.0:`と書かれたスイッチが有ると思うので、
    それをクリックします。
    ひたすらOKをクリックしていきます。

1. __データの取得__
    認可が終わったら、`Execute`ボタンをクリックします。
    そうすると`Execute`ボタンの下に結果が表示されます。
    なんかエラーっぽいのがあったらFile IDが間違っているか、認可をやってない、またはGoogle先生がご機嫌斜めです。

1. __ダウンロードリンクを探す__
    結果はJSON形式で返されます。
    ダウンロードリンクは`exportLinks`というプロパティに入っているので`exportLinks`を探して下さい。
    それで上記のダウンロードURLが取得出来ます。

#### プログラムからダウンロード

プログラムからコードをダウンロードするにはOAuthフローなどで取得した認可コードが設定されたAuthorizationヘッダーが必要になります。
良い感じでやって下さい。( ｰ`дｰ´)ｷﾘｯ
  

### 3. GASからダウンロードリンクを取得

実はGASからも簡単にダウンロードリンクは取得が可能です。

DriveAppから取得できるFileのgetDownloadUrl()を使って下さい。

#### サンプルコード

```javascript:ダウンロードリンクを取得.js

//File idは上とかでよく出てくるScript Editorを開いた時にURLに記載されたID
function getDownloadLink(fileId) {
    return DriveApp.getFileById(fileId).getDownloadUrl();
}
```

またGAS上記ダウンロードリンクからソースコードを取得する場合は以下の様なコードになります。
以下のコードをScript Editorに貼り付けて、
`ファイルID`を書き換えると、ログにソースコードが表示されます。

testメソッドを起動するとソースコードが表示されます。


#### GASでGASのコードをダウンロード

```javascript:GASでGASのコードをダウンロード

function downloadGASFiles(downloadUrl) {

    //Google OAuth用の設定
    var oauthConfig = UrlFetchApp.addOAuthService('drive');

    var scope = 'https://www.googleapis.com/auth/drive+https://www.googleapis.com/auth/drive.file+https://www.googleapis.com/auth/drive.scripts';
    oauthConfig.setConsumerKey('anonymous');
    oauthConfig.setConsumerSecret('anonymous');
    oauthConfig.setRequestTokenUrl('https://www.google.com/accounts/OAuthGetRequestToken?scope='+scope);
    oauthConfig.setAuthorizationUrl('https://accounts.google.com/OAuthAuthorizeToken');  
    oauthConfig.setAccessTokenUrl('https://www.google.com/accounts/OAuthGetAccessToken');

    //UrlFetchAppの設定
    var options = {
        method:'get',
        oAuthServiceName: 'drive',
        oAuthUseToken: 'always'
    };

    //ダウンロード
    var jsonString = UrlFetchApp.fetch(url,getParams).getContentText();

    //JSON形式なのでパース
    return JSON.parse(json);
}

function test() {
    var gasFiles = downloadGASFiles("ファイルID");

    for(var i = 0;i &lt; gasFiles.files.length; i++) {
        Logger.log("ファイル名:%s", gasFiles.files[i].name);
        Logger.log("コード:%s", gasFiles.files[i].source);
    }
}

```

### 補足:ダウンロードしたJSONの内容

ダウンロードしたJSONは以下の様な形式に成っています。

```javascript:JSON形式.js
{
    'files':[
        {
            'id' : 'GASプロジェクト内の多分一意なファイルID',
            'name' : 'ファイル名',
            'type' : 'ファイルのタイプ server_js:.gs形式のGASのコード  html:HtmlServiceで利用するhtml',
            'source' : '実際のコード'
        }
        //プロジェクト内のファイルの数だけ上があります。
    ]
}

```

# 終わり

ということで今回はImport/ExportのImport編でした。
今回書いたことを使うことで、GASファイルのバックアップをしたりすることがかなり簡単に出来ます。

多分開発をやっている方は次回のExport編が気になると思いますので、なるべく頑張って直ぐ書きます。