kintone コマンドラインツール (cli-kintone)
(著者:瀧ヶ平 充)
Index
はじめに
今回は、別のアプリから参照している顧客リストの最終訪問日をkintoneコマンドラインツール(cli-kintone)を使って更新する処理を作成します。
注意事項
第7回(バックアップ処理をシェルスクリプトにしてみよう)・第8回(バックアップの処理を定期実行してみよう)に引き続き、高度なコマンドライン操作が必要となるため、今回もbashを前提としています。Windowsをご利用の方はWindows Subsystem for Linux(WSL)上のbashを利用してください。WSL上ではLinux用のcli-kintoneを使用します。
また、今回はgawk
というコマンドを利用します。使用している環境で利用できない場合はインストールを行ってください。
アプリの準備
今回は顧客リストアプリと商談報告書アプリをカスタマイズして使います。これらのアプリは「kintoneアプリストア」から追加しておきましょう。
顧客リストアプリの設定
まず、会社名のフィールドを重複不可の設定にします。ここではフィールドをCompany
とします。
次に、latest_visit
というフィールドコードで「最終訪問日時」という日時フィールドを作ります。
実運用の際は必要に応じてフィールドを増減させてもよいでしょう。
顧客リストアプリの設定はこれで完了です。
商談報告書アプリの設定
まず、「相手側社名」というルックアップフィールドを作り、以下のようにルックアップを設定します。フィールドコードはルックアップ
とします。
次に、「訪問日時」という日時フィールドを新たに作成するか、あるいは既にある日付フィールドを置き換えます。こちらはフィールドコードをvisit_datetime
とします。
「商談報告書」のフォーム画面は、このようになります。
最終訪問日を記録する
顧客リストの最終訪問日を追加・更新します。以下のコマンドを実行して、商談報告書アプリのレコードを基に顧客リストのレコードに最終訪問日を追加します。
コマンドを実行する前に、顧客リストアプリのAPIトークンの「レコード閲覧、レコード編集」及び、商談報告書アプリのAPIトークンの「レコード閲覧」を有効にしておきましょう。
bashでは、行の末尾に\
を追加するとコマンドを実行せずに改行することができます。
今回はコマンドが長くなってしまったので、これを用いて改行で整形しています。
それでは、パイプで区切った各コマンドについて解説します。
報告書レコードの取得
この部分では、商談報告書アプリからルックアップで取得している会社名および訪問日時を取得し、パイプラインで次のコマンドの入力に渡しています。
次のコマンド以降で処理しやすいように、クエリで条件を指定して表示を訪問日時の昇順で取得しています。
これは簡単ですね。
データの整形
この部分は、sed
コマンドを用いて1行目のヘッダー部分を削除し、その出力をgawk
コマンドへ渡しています。
gawk
コマンドは、与えられた入力に対して順に1行ずつ指定したプログラムを実行します。
今回は指定したオプション、および今回書いたプログラムについてのみ解説します。詳細はman gawk
などで確認してください。
gawk
の-v
オプション
gawk
コマンドは各行の入力を空白で区切り、区切られた文字列を左から順に$1
,$2
,…のようにプログラム内の変数に格納します。
-v
というオプションでは各行に対してプログラムを実行する前に、変数に値を代入出来るオプションです。
今回はFPAT
という変数に'([^,]+)|(\"[^\"]+\")'
という正規表現の値を代入しました。
これによって、カンマで区切るだけでなく"
で囲まれた値についても区切って変数で扱えるようになります。
gawk
のプログラム
今回はこの部分が実際に実行されるgawk
のプログラムです。
gawk
では{}
で囲まれた処理が各行ごとに実行されます。
そこにEND
を追加すると、各行の処理が終わった後に指定の処理を実行してくれます。
gawk
では、#
で始まる行はコメント行になります。
また、予約語以外であれば変数は宣言なしで利用でき、配列も使えます。
例えば、array
という変数に対して array["hoge"]="fuga"
を実行すれば、後にarray["hoge"]
としてfuga
という値が得られます。
今回のコマンドでは、下記のような配列を各行で利用しています。
これはdate
という配列を用意し、区切られた1番目の値を配列のキーとして、2番目の値をそのキーに対応する値として代入しています。
つまりこの処理では、ルックアップで指定した会社名に対応する値として訪問日時の値を各行上から順に入れていることになります。
先程のcli-kintoneのクエリ指定で、訪問日時の昇順でレコードを取得しているので、すべての行を読み込んだあとは最新の訪問日時が各会社の最終訪問日の値になります。
そして、各行の処理が終わった後はEND
の部分を実行します。
まず、顧客リストの更新用にCSVのヘッダーをprint
命令で最初の行に出力します。
会社名のフィールドを指定して更新したいので、*Company
の*
は忘れないようにしましょう。
次に、先程使った配列変数date
からfor
文を使ってCSVの行を出力していきます。
ここでは、配列の添字を変数key
としてループ処理をします。このkey
が会社名で、date[key]
が最新の訪問日時になります。
gawk
では、空白で区切ることにより文字列が結合されます。
print key "," date[key]
を実行すると、下記フォーマットのCSV行が作成できます。
ここまでの処理で、商談報告書アプリのレコードから会社名と最新の訪問日時のデータを取得し、顧客リストを更新するためのCSVができました。
今回はリダイレクトを使わずに、パイプでcli-kintoneにCSVを渡して更新するテクニックを使ってみます。
顧客リストの更新
現在のところ、cli-kintoneではパイプで渡された値を読み込むことはできません。
しかし、今回のように/dev/stdin/
というパスをプログラムが読み込むことで、パイプラインから渡された値を利用できます。
/dev/stdin
というのは標準入力(パイプラインなどで渡されたデータ)にアクセスするための特別なファイルです。
プログラムやシェルスクリプトなどでここにアクセスすると、引数で渡されたものとは別の値を読み込むことができます。
※Version 0.9.0から、パイプで渡された値を読み込めるようになりました。詳細はkintone コマンドラインツール Version 0.9.0 新機能紹介を参照してください。
定期的に実行する
定期実行するために、ひとまず先程のコマンドをシェルスクリプトにしましょう。
今回も第8回と同様に実行日時の記録と、エラーログを記録できるようにしましょう。
今回はこのシェルスクリプトをupdate_latest_visit.sh
として保存し、chmod +x update_latest_visit.sh
を実行してシェルスクリプトに実行権を設定します。
定期実行の設定は第8回を参考にして行ってください。
時刻とupdate_latest_visit.sh
へのパスを設定したら設定時刻まで待つか、あるいはすぐ近くの日時に設定して動作を確認してみましょう。
このTipsは、cli-kintone Ver 0.10.2 と2020年3月版 kintone で確認したものになります。
記事に関するフィードバック
記事のコメント欄は記事に対するフィードバックをする場となっております。
右の記事フィードバックのためのガイドを参照してコメントしてください。
記事のリンク切れなど、気になる点がある場合も、こちらのフォームからフィードバックいただけますと幸いです。