kintone Advent Calendar 2015の2日目です。
今回はkintoneのスペースを活用するためのプログラムを作ってみたいと思います。
$\color{red}{\rm ※訂正}$
「Process exited before completing request」エラーが出力される件で、出力されないようにソースを修正しました。
yamaryu0508さん、ご指摘ありがとうございましたm(_ _)m
kintoneのスペースを有効活用しよう
kintoneにはデータを蓄積するアプリだけで無く、ダッシュボードや掲示板として使えるスペースが存在します。
スペースにはアプリやグラフを貼り付ける事ができ、アプリに蓄積されたデータを見える化するためにとても便利に使えます。
上のキャプチャにもあるように「今季売上◯◯円突破!」とか「今季実績◯◯円!」のように、アプリに蓄積した数値データを集計して表示したいケースがありますが、手作業でメンテナンスしている人も多いのではないでしょうか。
今回はkintone APIを使って、自動化してみたいと思います。
想定するアプリ
販売実績が蓄積された簡単なアプリを想定しています。
販売実績アプリに蓄積された実績金額を集計し、「今季の実績は◯◯円です!」とスペースに表示します。
会社名や型番など入力項目がいくつもありますが、これから作るプログラムに関係がある点は以下の通りです。
- 「販売金額」のフィールドに集計したい金額が保存されている
- 「販売金額」のフィールドコードはsalesamountとする
- 「販売年月」のフィールドコードはsaledateとする
後でアプリIDが必要になるので控えておいてください。
アプリIDはkintoneアプリをブラウザで閲覧した際のURLで確認でき、以下の例だとアプリIDは123です。
http://SUBDOMAIN.cybozu.com/k/123/
実績金額を表示するためのスペースも用意しておきます。今回はシングルスレッドのスペースを使う想定です。
後ほどスレッドIDが必要になるので控えておいてください。
スレッドIDはkintoneスペースをブラウザで閲覧した際のURLで確認でき、以下の例だとスペースIDは5です。
https://SUBDOMAIN.cybozu.com/k/#/space/4/thread/5
プログラムの流れ
プログラムの流れは以下のようになります。
- レコードの取得APIを使い、販売実績アプリから実績金額を取得します。
- 取得した実績金額を合算し、合計金額を計算します。
- スペースの本文の更新APIを使い、スペースの本文に合計金額を記載します。
上記の処理を実現するプログラムを作り、タスクスケジューラやcronで定期的に実行する事でスペースの更新を自動化する事ができます。
通常はプログラムを実行するためにサーバーを用意する必要がありますが、今回はサーバーレスを謳ってみたのでAWS Lambdaを使って実現したいと思います。
AWS Lambdaについての詳細は公式サイトをご覧下さい。
Lets's Coding!
今回の処理をLambdaで実現するには、JavaScript(Node.js)でコーディングしたプログラム一式をZip化してLambdaにアップロードする必要があります。
サーバーレスを謳ってみた(しつこい)ので、開発もクラウド環境を使ってみます。
今回は無料プランがあるKodingを使ってみました。(Cloud9でも同じ事が実現できます)
KodingはGithub、Google、Facebook、Twitterのアカウントでサインアップできるので手軽に使えます。
以下のコードをindex.jsとして保存します。
var aws = require('aws-sdk');
var request = require('request');
/* kintone用のパラメータ(変更が必要) */
var DOMAIN = 'subdomain.cybozu.com'; //kintone環境のドメイン
var APP_ID = 1; //実績アプリのアプリID
var SPACE_ID = 1; //スペースのID
var LOGIN_NAME = 'Administrator';
var PASSWORD = 'secret';
/* 変更は不要 */
var BASE_URL = "https://" + DOMAIN + '/k/v1/';
var AUTH_VALUE = new Buffer(LOGIN_NAME + ':' + PASSWORD).toString('base64');
var headers = {'X-Cybozu-Authorization': AUTH_VALUE};
exports.handler = function(event, context) {
//--------------------------------------------------
//販売実績アプリから実績金額を取得
//--------------------------------------------------
//販売実績アプリからレコードを取得する際のリクエストパラメーター
var body_getsalesamount = {
app: APP_ID,
query: 'saledate=THIS_MONTH()',
fields: "salesamount"
}
//販売実績アプリからレコードを取得する際のヘッダー
var options_getsalesamount = {
url: BASE_URL + 'records.json',
method: 'GET',
headers: headers,
'Content-Type': 'application/json',
json: body_getsalesamount
}
//レコードを取得
request(options_getsalesamount, function (error, response, body) {
if (!error && response.statusCode == 200) {
//取得した結果から販売実績を取得し、レコードの数だけ合算する
var records = body.records;
if(records.length === 0) return;
var total = 0;
for(var i=0;i<records.length;i++){
var salesamount = parseInt(records[i].salesamount.value);
total = total + salesamount;
}
console.log(total);
//--------------------------------------------------
//スペース本文を更新
//--------------------------------------------------
//スペース本文を更新する際のリクエストパラメーター
body_updatespace = {
id: SPACE_ID,
body : '<font size="6">今期実績:<font color="red">¥' + total + '</font></font>'
}
//スペース本文を更新する際のヘッダー
options_updatespace = {
url: BASE_URL + 'space/thread.json',
method: 'PUT',
headers: headers,
'Content-Type': 'application/json',
json: body_updatespace
}
//スペース本文を更新
request(options_updatespace, function(error, response, body){
if (!error && response.statusCode == 200) {
console.log(body);
context.succeed(body);
} else {
console.log('error: '+ response.statusCode);
context.fail('error: '+ response.statusCode);
}
});
}
})
};
以下の点は環境に合わせて適宜変更して下さい。
変数名 | 設定する値 |
---|---|
DOMAIN | kintone環境のドメイン |
APP_ID | 販売実績アプリのアプリID |
SPACE_ID | 実績金額を表示するスペースのスペースID |
LOGIN_NAME | APIを実行するkintoneユーザーのログイン名 |
PASSWORD | APIを実行するkintoneユーザーのパスワード |
Node.jsのrequestモジュールを使うため、モジュールのインストールを行います。
Koding上でTerminalを開き、以下のコマンドを実行すれば完了です。
npm install request
LambdaにインポートするZip形式にするため、Terminalで以下のコマンドを実行します。
※コマンドが完了した直後は、space.zipと/home/Username/space.zipの2つのファイルがディレクトリツリー上に表示されていますが、ブラウザをリロードすればspace.zipだけが表示されるようになります。
zip -r space.zip index.js node_modules/
space.zipをダウンロードするには、ファイルをWebディレクトリに移動してから以下のURLにアクセスします。
http://Username.koding.io/space.zip
Lambdaの設定
AWSのコンソールにログインし、「Lambda > Functions」の「Create a Lambda function」をクリックします。
Step 1: Select blueprint
「Skip」を選択します。
Step 2: Configure function
- Configure function
- NameとDescriptionは適当に入力、Runtimeは「Node.js」を選択します。
- Lambda function code
- Code entry typeは「Upload a .ZIP file」を選択し、KondingからダウンロードしたZipファイルを指定します。
- Lambda function handler and role
- Handlerはデフォルト(index.handler)のままで
- Roleは「Basic execution role」を選択し、IAM ロールを新規に作成するか、既に作成済みのロールを選択します
Zipの読み込みが完了したらコンソール上でテストを実行してみます。
「Process exited before completing request」と表示されていますが、今回の場合は問題ありません。
最後にLambdaファンクションが定期的に実行されるように設定を行います。
「Event sources」タブを選択し、 「Add event source」をクリックします。
「Add event source」のポップアップが表示されたら以下のように設定します。
- Event source type
- Scehduled Eventを選択します。
- Name
- 任意の情報を入力します。
- Description
- 任意の情報を入力します。
- Schedule expression
- 定期実行したい時間間隔を選びます。
これでLambdaがkintoneのスペースを自動で更新してくれるようになります!
注意事項
- スペースが更新されない場合、Lambdaがタイムアウトしている可能性があります。(CloudWatchに「Task timed out after 3.00 seconds」と出力されます)その場合は、「Lambda > Functions」の「Configuration」タブを選択し、「Advanced settings」のTimeout値を延ばして下さい。
- 現状のスクリプトではレコードが100件を超えたレコードは取得されません。
まとめ
今回はスペースを活用する例を取り上げてみました。
kintone APIを使うと他にもいろいろな事が実現できます。
APIの仕様はcybozu.com developer networkに情報をまとめていますので、興味を持って頂いた方は是非ご覧下さい!
1年間無料で利用できる開発者ライセンスも発行しております。