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