kintoneからspreadsheetに情報を転記する（簡易版）

#はじめに
[kintone](https://kintone.cybozu.co.jp/)は誰が記入、更新したかがわかるので便利なんですが、単体では集計やその他のシステムとの自動化に弱いのが難点です。
数式を用いて集計を行いたいと思い、kintone→[spreadsheet](https://www.google.com/intl/ja_jp/sheets/about/)へ情報を転記するものをつくりました。

以下の記事を元にしております（以下記事中のライブラリのインストールがいるかも）。
https://qiita.com/Arahabica/items/063877b0da439020d2c2
https://qiita.com/sutatin/items/0dd3eea4fce83ae21ace

#初期設定
###spreadsheetのコピー
以下リンクのspreadsheetをコピーして使ってください
https://docs.google.com/spreadsheets/d/18ullmN2Lxxz7sSOV8ySEthF92_X_DODD_espo3rSPkQ/edit?usp=sharing

###kintoneアプリ情報の設定
「マスタ」というシートに情報を入力してください
<img width="498" alt="スクリーンショット 2019-06-18 16.51.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172695/ba290cf9-261e-24ce-fe6f-96f76539b0a4.png">
1. 「アプリID」という列に、kintoneでアプリをつくるとURLが「〜.cybozu.com/k/◯◯/」となっていますが、この◯◯の数字を入れてください。
2. 「アプリ名」という列に、kintoneのアプリの名前を入れてください

※アプリ通番のところは、アプリIDに記入があれば自動で設定されるようになっています。


###ユーザー情報の入力
1. spreadsheetのスクリプトエディタを開いてください
<img width="651" alt="スクリーンショット 2019-06-18 16.59.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172695/1db858b5-47cd-49cd-334c-a3b2a495e145.png">

2. ファイルの「プロジェクトのプロパティ」を開いてください
<img width="368" alt="スクリーンショット 2019-06-18 17.02.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172695/7908b1f9-38d5-7bbb-449f-2f246b434630.png">

3. 以下の情報を設定してください。
    1. subdomain - サイボウズのURLのサブドメイン(https://◯◯.cybozu.com/の◯◯の部分)
    2. user - ログインする時のユーザー名
    3. pass - ログインする時のパスワード
<img width="674" alt="スクリーンショット 2019-06-18 17.03.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172695/ea591bee-206f-a062-bad5-6833a358445c.png">

※ユーザー名、パスワードに使うアカウントは管理者権限が必要かも
###各取得条件（クエリ）の設定
操作シートに以下情報を入力します。

- 「実行」列
    - ここがtrueである行が実行されます
- 「アプリNo」列
    - kintoneのアプリIDを設定してください
- 「クエリ」列
    - [ここ](https://developer.cybozu.io/hc/ja/articles/115001436186-%E7%AC%AC4%E5%9B%9E-%E3%82%AF%E3%82%A8%E3%83%AA%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E6%9B%B4%E6%96%B0-%E4%B8%A6%E3%81%B3%E9%A0%86%E5%A4%89%E6%9B%B4%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)を参照して設定してください（未記入でも実行可）
    - 初期状態では最大数100件までに制限されます。クエリに「limit 500」を追加すると、最大500件まで取得することができます。
- 「出力シート名」列
    - 出力する、spreadsheetのシート名を記入してください。

##実行
「概要」シートの猫の画像を押すと、処理が開始されます。

#ソース
https://github.com/nag8/querySheetByKintone

```gas:main.js
var manager = '';
var apps = {};

// メイン処理
function main() {

  prepare();
  control();

}


// 初期化
function prepare() {

  // 各種設定
  var subdomain = PropertiesService.getScriptProperties().getProperty("subdomain");
  var user      = PropertiesService.getScriptProperties().getProperty("user");
  var pass      = PropertiesService.getScriptProperties().getProperty("pass");

  // アプリ情報の設定
  var sheet     = SpreadsheetApp.getActive().getSheetByName('マスタ');
  var data      = sheet.getDataRange().getValues();
  var appName   = '';

  // 2行目から検索
  for (var i = 1; i < data.length; i++) {

    // 1列目が空ではないとき
    appName = data[i][0];
    if('' !== appName){
      apps[appName] = {};
      apps[appName]['appid'] = data[i][1];
      apps[appName]['name']  = data[i][2];
    }
  }
  Logger.log(apps);

  // パスワード認証
  manager = new KintoneManager.KintoneManager(subdomain, apps, user, pass);
}

// 検索
function control() {

  // 操作シートの情報を取得
  var sheet      = SpreadsheetApp.getActive().getSheetByName('操作');
  var data       = sheet.getDataRange().getValues();
  var utillList  = '';
  var query      = '';
  var records    = '';
  var sheetWrite = '';
  var appName    = '';

  // 2行目から検索
  for (var i = 1; i < data.length; i++) {

    // 1列目がtrueの場合
    utillList = data[i];
    if (utillList[0]) {

      // kintoneの対象アプリ名を取得
      appName = searchApp(utillList[1]);

      // クエリを取得
      query = utillList[2];

      // 検索処理
      records = search(appName, query);

      // 書き込みシートを取得
      sheetWrite = SpreadsheetApp.getActive().getSheetByName(utillList[3]);
      writeSheet(sheetWrite, records);
    }
  }
}



// 検索処理
function search(appName, query){

  // 検索を実行
  var response = manager.search(appName, query);

  // 結果コード
  Logger.log('ステータスコード：' + response.getResponseCode());

  // レコードの配列を返却
  return JSON.parse(response.getContentText()).records;
}

// シートに書き込み
function writeSheet(sheet, records){


  // 列見出しを取得
  var array_kintone_fields = sheet.getRange("1:1").getValues()[0];
  array_kintone_fields = array_kintone_fields.filter(Boolean);

  // 書き込み行
  var row = 2;

  // 100行の内容を削除
  sheet.getRange(row, 1, 100, array_kintone_fields.length).clearContent();

  // レコードが取得された場合
  if(typeof records !== 'undefined'){

    // 値設定
    records.forEach(function(record){
      array_kintone_fields.forEach(function(kintone_field,index){
        sheet.getRange(row,index+1).setValue(record[kintone_field].value);
      })
       row++;
    })

  // レコードが取得されなかった場合
  }else{
    sheet.getRange(row,1).setValue('あれ？取得できませんでした…');
  }



}

// アプリケーション名を検索
function searchApp(appId){

  // 対象アプリを検索
  for (var key in apps) {

    // アプリIDが一致した場合
    if(apps[key].appid === parseInt(appId, 10)){

      // アプリ名を返却
      Logger.log('アプリ→' + key);
      return key;
    }
  }

  // 見つからなかった場合
  Logger.log('アプリが見つかりませんでした');
  return "";
}

```

#さいごに
表の横に集計数式を設定したいけど、今のところ「spreadsheetのすべての情報をとってきて、見出しに合うkintone情報を設定」としているので、数式の列があるとバグってしまう。
いつかなんとかしたい…