LoginSignup
6
7

More than 3 years have passed since last update.

kintoneからspreadsheetに情報を転記する(簡易版)

Last updated at Posted at 2019-06-18

はじめに

kintoneは誰が記入、更新したかがわかるので便利なんですが、単体では集計やその他のシステムとの自動化に弱いのが難点です。
数式を用いて集計を行いたいと思い、kintone→spreadsheetへ情報を転記するものをつくりました。

以下の記事を元にしております(以下記事中のライブラリのインストールがいるかも)。
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アプリ情報の設定

「マスタ」というシートに情報を入力してください
スクリーンショット 2019-06-18 16.51.19.png
1. 「アプリID」という列に、kintoneでアプリをつくるとURLが「〜.cybozu.com/k/◯◯/」となっていますが、この◯◯の数字を入れてください。
2. 「アプリ名」という列に、kintoneのアプリの名前を入れてください

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

ユーザー情報の入力

  1. spreadsheetのスクリプトエディタを開いてください
    スクリーンショット 2019-06-18 16.59.46.png

  2. ファイルの「プロジェクトのプロパティ」を開いてください
    スクリーンショット 2019-06-18 17.02.32.png

  3. 以下の情報を設定してください。

    1. subdomain - サイボウズのURLのサブドメイン(https://◯◯.cybozu.com/の◯◯の部分)
    2. user - ログインする時のユーザー名
    3. pass - ログインする時のパスワード スクリーンショット 2019-06-18 17.03.40.png

※ユーザー名、パスワードに使うアカウントは管理者権限が必要かも

各取得条件(クエリ)の設定

操作シートに以下情報を入力します。

  • 「実行」列
    • ここがtrueである行が実行されます
  • 「アプリNo」列
    • kintoneのアプリIDを設定してください
  • 「クエリ」列
    • ここを参照して設定してください(未記入でも実行可)
    • 初期状態では最大数100件までに制限されます。クエリに「limit 500」を追加すると、最大500件まで取得することができます。
  • 「出力シート名」列
    • 出力する、spreadsheetのシート名を記入してください。

実行

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

ソース

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情報を設定」としているので、数式の列があるとバグってしまう。
いつかなんとかしたい…

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7