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

  • 9
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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