Edited at
kintoneDay 2

kintone APIを使ってスペースを有効活用する(サーバーレスで)

More than 3 years have passed since last update.

kintone Advent Calendar 2015の2日目です。

今回はkintoneのスペースを活用するためのプログラムを作ってみたいと思います。

$\color{red}{\rm ※訂正}$

 「Process exited before completing request」エラーが出力される件で、出力されないようにソースを修正しました。

 yamaryu0508さん、ご指摘ありがとうございましたm(_ _)m


kintoneのスペースを有効活用しよう

kintoneにはデータを蓄積するアプリだけで無く、ダッシュボードや掲示板として使えるスペースが存在します。

スペースにはアプリやグラフを貼り付ける事ができ、アプリに蓄積されたデータを見える化するためにとても便利に使えます。

スペース

acba049f-3fca-3350-8293-80e1b7d40d18.png

上のキャプチャにもあるように「今季売上◯◯円突破!」とか「今季実績◯◯円!」のように、アプリに蓄積した数値データを集計して表示したいケースがありますが、手作業でメンテナンスしている人も多いのではないでしょうか。

今回はkintone APIを使って、自動化してみたいと思います。


想定するアプリ

販売実績が蓄積された簡単なアプリを想定しています。

販売実績アプリに蓄積された実績金額を集計し、「今季の実績は◯◯円です!」とスペースに表示します。

販売実績アプリのイメージです。

FireShot Screen Capture #096 - '販売実績 - サイボウズ株式会社 - レコードの詳細' - cy-asaga_cybozu_com_k_505_show#record=1&l_view=5264865&l_q&l_sort_0=f5264846&l_order_0=DESC.png

会社名や型番など入力項目がいくつもありますが、これから作るプログラムに関係がある点は以下の通りです。


  • 「販売金額」のフィールドに集計したい金額が保存されている

  • 「販売金額」のフィールドコードはsalesamountとする

  • 「販売年月」のフィールドコードはsaledateとする

後でアプリIDが必要になるので控えておいてください。

アプリIDはkintoneアプリをブラウザで閲覧した際のURLで確認でき、以下の例だとアプリIDは123です。

http://SUBDOMAIN.cybozu.com/k/123/

実績金額を表示するためのスペースも用意しておきます。今回はシングルスレッドのスペースを使う想定です。

FireShot Screen Capture #098 - '営業部スペース' - cy-asaga_cybozu_com_k_#_space_4_thread_5.png

後ほどスレッドIDが必要になるので控えておいてください。

スレッドIDはkintoneスペースをブラウザで閲覧した際のURLで確認でき、以下の例だとスペースIDは5です。

https://SUBDOMAIN.cybozu.com/k/#/space/4/thread/5


プログラムの流れ

プログラムの流れは以下のようになります。

1. レコードの取得APIを使い、販売実績アプリから実績金額を取得します。

2. 取得した実績金額を合算し、合計金額を計算します。

3. スペースの本文の更新APIを使い、スペースの本文に合計金額を記載します。

上記の処理を実現するプログラムを作り、タスクスケジューラやcronで定期的に実行する事でスペースの更新を自動化する事ができます。

通常はプログラムを実行するためにサーバーを用意する必要がありますが、今回はサーバーレスを謳ってみたのでAWS Lambdaを使って実現したいと思います。

AWS Lambdaについての詳細は公式サイトをご覧下さい。


Lets's Coding!

今回の処理をLambdaで実現するには、JavaScript(Node.js)でコーディングしたプログラム一式をZip化してLambdaにアップロードする必要があります。

サーバーレスを謳ってみた(しつこい)ので、開発もクラウド環境を使ってみます。

今回は無料プランがあるKodingを使ってみました。(Cloud9でも同じ事が実現できます)

FireShot Screen Capture #093 - 'Koding I Say goodbye to your localhost and code in the cloud_' - koding_com.png

KodingはGithub、Google、Facebook、Twitterのアカウントでサインアップできるので手軽に使えます。

FireShot Screen Capture #092 - 'Koding I Say goodbye to your localhost and code in the cloud_' - koding_com_Login.png

ログインすると自分用のVM環境が割り当てられます。

ef0ca93c-77ea-5a3f-b5c3-32177a2fbeef.png

以下のコードをindex.jsとして保存します。


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」をクリックします。

8958978a-deb6-c244-c0c6-52c51c7c197c.png

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の読み込みが完了したらコンソール上でテストを実行してみます。

b42ab465-b21c-8230-8905-a9ee59e9418a.png

「Process exited before completing request」と表示されていますが、今回の場合は問題ありません。

スペースを確認して、実績金額が表示されていたら成功です!

FireShot Screen Capture #105 - '営業部スペース' - cy-asaga_cybozu_com_k_#_space_4_thread_5.png

最後にLambdaファンクションが定期的に実行されるように設定を行います。

「Event sources」タブを選択し、 「Add event source」をクリックします。

da31ce0c-e444-e3ae-3510-86491b1a5cb5.png

「Add event source」のポップアップが表示されたら以下のように設定します。


  • Event source type


    • Scehduled Eventを選択します。



  • Name


    • 任意の情報を入力します。



  • Description


    • 任意の情報を入力します。



  • Schedule expression


    • 定期実行したい時間間隔を選びます。



FireShot Screen Capture #103 - 'AWS Lambda' - ap-northeast-1_console_aws_amazon_com_lambda_home_region=ap-northeast-1#_functions_effectiveuseofkintonespace_tab=eventSources.png

これで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年間無料で利用できる開発者ライセンスも発行しております。