#はじめに
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アプリ情報の設定
「マスタ」というシートに情報を入力してください
- 「アプリID」という列に、kintoneでアプリをつくるとURLが「〜.cybozu.com/k/◯◯/」となっていますが、この◯◯の数字を入れてください。
- 「アプリ名」という列に、kintoneのアプリの名前を入れてください
※アプリ通番のところは、アプリIDに記入があれば自動で設定されるようになっています。
###ユーザー情報の入力
- spreadsheetのスクリプトエディタを開いてください
- ファイルの「プロジェクトのプロパティ」を開いてください
- 以下の情報を設定してください。
- subdomain - サイボウズのURLのサブドメイン(https://◯◯.cybozu.com/の◯◯の部分)
- user - ログインする時のユーザー名
- pass - ログインする時のパスワード
※ユーザー名、パスワードに使うアカウントは管理者権限が必要かも
###各取得条件(クエリ)の設定
操作シートに以下情報を入力します。
- 「実行」列
- ここがtrueである行が実行されます
- 「アプリNo」列
- kintoneのアプリIDを設定してください
- 「クエリ」列
- ここを参照して設定してください(未記入でも実行可)
- 初期状態では最大数100件までに制限されます。クエリに「limit 500」を追加すると、最大500件まで取得することができます。
- 「出力シート名」列
- 出力する、spreadsheetのシート名を記入してください。
##実行
「概要」シートの猫の画像を押すと、処理が開始されます。
#ソース
https://github.com/nag8/querySheetByKintone
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情報を設定」としているので、数式の列があるとバグってしまう。
いつかなんとかしたい…