KintoneからGASを使ってSpreadsheetsにデータ転記する。

# 概要
サイボウズ社のKintoneはデータの収集や管理は劇的に楽にしてくれましたが、
残念ながら複数のアプリデータを関連させて分析するような業務は苦手でした。
とはいえ、分析作業のため毎回複数のアプリからCSVを出力して集計表等に貼り付けるのも手間がかかります。

そのため、GAS(GoogleAppsScript)のトリガー機能を利用して
KintoneのAPI経由でデータを取得、Spreadsheetへの貼付けを行い、
KPI等の値を自動で更新される仕組みを整えたのでやり方を記載します。

# 下準備
GASの基本的な使い方などは省略します。
[Qiita GoogleAppsScriptタグ](http://qiita.com/tags/GoogleAppsScript)などご参考ください。

とりあえず連携データを流し込みたいSpreadsheetを作成して流し込みたいシートを作成しましょう。
ここではkintoneの本アプリを流し込むためにsheet_book、
著書アプリを流し込むためにsheet_authorを作成したことにします。

次にスクリプトエディタを起動してGASを書き始めます。
Kintoneからデータを取得する際は下記で紹介されているライブラリを利用させていただきました。
[kintone とGoogle Apps Script連携](http://qiita.com/Arahabica/items/063877b0da439020d2c2)

リソース＞ライブラリから
```MDT2NQ9jkAGYJ-7ftp_A0v08CaFRWuzzx```
を導入しておきましょう。

# 最終的なサンプルコード

```js

// トリガーで１時間に１回実行などにする。
function myFunction() {
  
  //初期処理
  prepare();
  
  //本データの流し込み
  writeBookInfo();
  
  //著書データの流し込み
  writeAuthorInfo();

}


//初期処理
function prepare(){
  //お行儀悪いけど、わざとvarを付けずにグローバルに定義
  
  if (typeof subdomain === "undefined") {
    subdomain = "kintoneのドメイン"; //https://****.cybozu.comの****を記入
  }
  
  if (typeof apps === "undefined") {
    apps = {
      BOOK: { appid: **, name: "本データ", token: "*********************" }
      ,AUTHOR: { appid: **, name: "著書データ", token: "******************" }
    };
  }
  
  if (typeof kintone_manager === "undefined") {
    kintone_manager = new KintoneManager.KintoneManager(subdomain, apps);
  }
}


function writeBookInfo(){
  var array_kintone_fields = ["レコード番号"
                              ,"文字列"/*題名*/
                              ,"ドロップダウン"/*ジャンル*/
                              ,"作成日時"/*作成日時*/];
  writeSheetFromRecords("sheet_book","BOOK",array_kintone_fields);  
}


function writeAuthorInfo(){
  var array_kintone_fields = ["レコード番号"
                              ,"文字列"/*著書名*/
                              ,"作成日時"/*作成日時*/];  
  writeSheetFromRecords("sheet_author","AUTHOR",array_kintone_fields);  
}

//以後は基本的に変更しなくて良い場所

//引数などからkintoneの情報をspreadsheetに流し込む関数
function writeSheetFromRecords(sheet_name,apps_key,array_kintone_fields){
  prepare();
  var records = getKintoneRecords(apps_key,kintone_manager);
  var sheet = SpreadsheetApp.getActive().getSheetByName(sheet_name);
  var row = 2;
  records.forEach(function(record){
      array_kintone_fields.forEach(function(kintone_field,index){
        sheet.getRange(row,index+1).setValue(record[kintone_field].value);
      })      
      row++;  
  })  
}

//引数からkintoneの情報をarrayにして返す関数
function getKintoneRecords(apps_key_name,kintone_manager){
  var offset = 0;  
  var loopendflg = false;
  var records =[];

  while(!loopendflg){    
    var query = 'offset ' + offset;
    var response = kintone_manager.search(apps_key_name, query);
    
    // ステータスコード
    // 成功すれば200になる
    var code = response.getResponseCode();

    // コンテンツの取得
    var content = JSON.parse(response.getContentText());
    
    // レコードの配列が取得
    Array.prototype.push.apply(records, content.records);
    
    if(content.records.length === 100){
      offset += 100;
    }else{
      loopendflg = true
    }      
  }
  
  return records;
}

```

とりあえず上のコードをコピペして
適時必要な箇所を書き換えて実行すれば連携されます。

#prepareでkintone認証情報を入力する

```js
function prepare(){
  //お行儀悪いけど、わざとvarを付けずにグローバルに定義
  
  if (typeof subdomain === "undefined") {
    subdomain = "kintoneのドメイン"; //https://****.cybozu.comの****を記入
  }
  
  if (typeof apps === "undefined") {
    apps = {
      BOOK: { appid: **, name: "本データ", token: "*********************" }
      ,AUTHOR: { appid: **, name: "著書データ", token: "******************" }
    };
  }
  
  if (typeof kintone_manager === "undefined") {
    kintone_manager = new KintoneManager.KintoneManager(subdomain, apps);
  }
}
```

以下を実施する。

- subdomainにkintoneのドメインを書き込む
- 取得したいkintoneアプリのappidとtokenを書き込む。

※kintoneのappidとはアプリURLに表示されている https://****/k/12 などの数字部(左の例だと12)です。
※[kintoneのAPIトークンの生成方法はこちら](https://cybozudev.zendesk.com/hc/ja/articles/202463840-API%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)

# 書き込み関数を作成する
```js
function writeAuthorInfo(){
  var array_kintone_fields = ["レコード番号"
                              ,"文字列"/*著書名*/
                              ,"作成日時"/*作成日時*/];  
  writeSheetFromRecords("sheet_author","AUTHOR",array_kintone_fields);  
}
```

array_kintone_fields にはkintoneから連携させたい項目の
フィールドコードの文字列を配列として記入しましょう。
Spreadsheetには、この記入順が列の順番になります。

kintone側でフィールドコードを適した名前に変更しているのが理想ですが、
フォームクリエイターとの連携等の関係で迂闊に変更できない事も多いと思うので、
私はインラインコメントでそのフィールドが何を表しているのか記入しています。

```js
writeSheetFromRecords("sheet_author","AUTHOR",array_kintone_fields);  
```
では、1つ目の引数にSpreadsheetの流し込み先のシート名、
2つ目の引数にprepareで記入したapps_keyを
3つ目の引数にarray_kintone_fieldsを渡します。

# それ以降について
基本的に書き換える必要は無いです。
Spreadsheetのシートは1行目をヘッダーを想定していたので
書き込み先が2行目からになっているのですが、変更したい場合は
row=2を適時書き換えてください。

# その他
Spreadsheetでは別のシートから参照して加工するようにしておけば、
自動で更新されたデータを元に分析内容を把握することが出来るようになります。

jsは余り慣れていないのでより良い書き方があれば適時ご指摘ください。