kintone ゲストスペースを跨いだアプリ同期はcli-kintoneを使おう!

皆さん、はじまして。普段は、自社製品の開発やSaaS、IaaSを使った開発を担当しております。この度、バイス・ネットの技術系ブログを執筆することになりました。

ところで、kintone使っていますか?直感的な操作で、アプリの作成・運用ができてとても便利ですよね。 

弊社では、社内での業務活用から始まり、現在は、様々なお客様から、kintoneの導入支援や、個別アプリケーションの開発についてご依頼を頂けるようになりました。

そこで、小ネタからカスタマイズ開発まで様々なノウハウを蓄えることができたので、役に立つ使い方や技術ネタをブログで紹介していくことにしました。 

第1回目は、ゲストスペースとcli-kintone(コマンドラインツール)を使ったテクニックを紹介します。 

ゲストスペースは、外部ユーザーと自社のアプリを共有する際によく使う機能ですが、社内スペースのレコードを直接参照できないため、どうやってタイムリーに参照させるのか等を考えないといけないですよね。そこを、cli-kintoneを使い、コストをかけずに実装する方法を紹介します。 

kintoneの外部連携サービス等を使って、コストや品質をかけるほどじゃないけど、なるべく手間もかけたくない人向けに参考になれば幸いです。 

【目次】

  1. 想定しているユースケース(kintoneアプリのモデルケース)
  2. cli-kintoneを使った実装手順 
  3. まとめ 

【免責事項】
当ブログの記載内容や情報の信頼性については可能な限り検証しておりますが、あくまでも、ご自身の判断にて、利活用を検討するようお願い致します。
本内容によって、被った損害・損失が発生した場合に、弊社は一切の責任を負いかねます。ご了承ください。
この記事は2023年5月15日の時点で書いています。今後のkintone、cli-kintoneのアップデートによっては、実装手順が異なる可能性があることをご了承ください。

1.想定しているユースケース 

今回は、社内スペースに案件管理というアプリがあり、社内のユーザーが業務利用しているが、パートナー企業の外部ユーザーに参照させる必要が発生した場合を想定しています。(下記のイメージ図) 

ここで言う外部ユーザーとはkintoneアカウントを所持していない、もしくは別ドメインでkintoneを使用している人を示します

案件管理アプリのフォーム設定は以下の表に記載しておりますが、社内スペースにある顧客マスタ、製品マスタを参照する作りになっています。 

案件管理アプリのフォーム設定

外部ユーザーに案件管理アプリを参照させるために、「ゲストスペースに案件管理アプリを移動させれば良いのでは?」と思った方、半分正解です。ゲストスペースは外部ユーザーをゲストとして招待でき、そのスペースに属する情報とアプリにのみアクセスできるように設定できます。 

しかし、ゲストスペースに下記の制約があります。 

  1. ゲストスペースを跨いでデータの参照、関連レコード一覧やルックアップが使えない 
  2. ゲストスペースでは、ゲストスペースに参加しているユーザーのみしか取得できない、また、ユーザーグループを取得できない 

そこで、ゲストスペース内にも全く同じ商品マスタのアプリを作成する方法や、案件管理アプリを使用するユーザーすべてをゲストスペースに参加させることで、対処可能ですが、マスタのメンテナンスは二重になり、ゲストスペースのユーザー管理、アクセス権のメンテナンスも増えることになってしまいますよね。 

また、ゲストスペースの案はやめて、外部連携サービスを利用するのも選択の一つですが、要件によっては、なるべく費用をかけずに対応したいですよね。 

そこで、下記の条件で満たせるなら、運用負荷や費用を掛けずに実現する方法があります。 

  • 外部ユーザーは、案件管理アプリのレコード参照のみおこなえればよい 
  • リアルタイムに案件管理アプリのレコードを同期しなくてもよい 
  • kintoneのスタンダートコースを契約している(REST APIが使用できる) 

実装する構成は下記の内容です。 

  • 案件管理アプリ、参照するマスタアプリは社内スペースから移動させない 
  • ゲストスペースに案件管理アプリのレプリカを作成する 
  • cli-kintoneを使って、社内スペースの案件管理アプリ(以後、オリジナルと表記)から、ゲストスペースの案件管理アプリ(以後、レプリカと表記)にレコード同期を定期的におこなう 

では、実際の実装手順について、説明します。

2.cli-kintoneを使った実装手順 

具体的なシステム構成は以下のようなイメージです。 

大まかな流れとしては、cli-kintoneをインストールする端末に、バッチファイルを作成し、社内スペースのデータをエクスポートして、ゲストスペースにインポートする仕組みを実装します。 

本ブログでは、Windows 環境を前提とした、実装方式を説明しておりますが、MacやLinux環境でも実装することは可能です。実際にご要望があれば、ぜひ弊社にご連絡ください。 

cli-kintoneをダウンロードする

まずはレコード同期を行う為のツールcli-kintoneをダウンロードします。

cli-kintoneは無償提供されているツールで、下記からダウンロードすることができます。

https://github.com/kintone/cli-kintone/releases

今回はWindows環境で使用しますので、最新版(2023年5月15日時点)のcli-kintone_v1.5.1_win.zip をダウンロードします。

解凍後のフォルダにcli-kintone.exeが含まれていますので、任意のフォルダに移動させます。(今回はC:\work\cli-kintoneを作成してその中に移動しました)

コマンドプロンプトを起動して、cli-kintone.exeがあるフォルダに移動します。

cli-kintone.exe –version と入力してバージョンが表示されることを確認しておきます。

C:\Users\xxxxx>cd /d
C:\work\cli-kintoneC:\work\cli-kintone>cli-kintone.exe –version
1.5.1
C:\work\cli-kintone>

ゲストスペースにレプリカを作成する 

次にゲストユーザーを招待、レプリカを作成するためのゲストスペースを作成します。

ポータル画面から「ゲストスペースを作成」を選択します。

今回はゲストスペース名を「案件共有プロジェクト」としました。

次はゲストスペースに案件管理アプリのレプリカを作成します。

ポイントとして、下記のとおりオリジナルと同じフィールドを配置しますが、前述のゲストスペースの制約を回避する為に、一部フィールドタイプを変更しています。

ゲストスペースの案件管理アプリ(レプリカ)のフォーム設定

次にレプリカのアプリのアクセス権を設定する為、「設定」→「アクセス権」の「アプリ」を開きます。

今回、ゲストユーザーはレコード参照のみ可能なことが条件ですので、Everyoneの「許可する操作」を「レコード閲覧」のみに変更しておきます。

最後に、オリジナル、レプリカ両方のAPIトークンを生成して控えておきましょう。

この後のcli-kintoneのコマンドで使用します。

・APIトークンの生成

「アプリの設定」→「設定」→「APIトークン」を開きます。

アクセス権は、以下の設定としてください。

オリジナル:レコード閲覧のみ

レプリカ:レコード閲覧、レコード追加、レコード編集

オリジナルの設定

レプリカの設定

export、importコマンドを使ってアプリ間同期を行う 

cli-kintoneを使ってオリジナルからレプリカにレコード同期をおこなうバッチファイルを作成します。今回は下記の条件で設定します。

  • cli-kintoneを配置した端末に、作成したバッチファイルをタスクスケジューラーで定期実行します
  • 実行頻度は1回/日とします
  • cli-kintoneは内部でKintone APIをコールしています

APIコール数については、1000件をエクスポート、インポートした場合、約20件発生する想定です

(参考:1日に実行できるAPIリクエスト数は、1つのアプリにつき10,000件)

オリジナルのデータをcsvにエクスポート

cli-kintoneでオリジナルのレコードをCSVにエクスポートします。

CSVをエクスポートするには、record export コマンドを使用します。

cli-kintone.exe record export^
    –base-url https://{サブドメイン}.cybozu.com^
    –app {オリジナルのアプリID}^
    –api-token {オリジナルのAPIトークン}^
    –fields 案件管理No,会社名,部署名,先方担当者,TEL,メールアドレス,^
案件担当者,見込み時期, 確度, 製品名, 単価, 数量, 小計^
–condition “作成日時 = TODAY() or 更新日時 = TODAY()”^
    –encoding sjis > record.csv

※サブドメイン、アプリID、APIトークンなどはご使用の環境に合わせてください

※–fieldsには対象となるフィールドのフィールドコードを指定します

※–conditionには当日に作成、更新されたレコードに絞る(差分出力)為のクエリを指定しています

レプリカにcsvをインポート

オリジナルからエクスポートしたCSVをレプリカにインポートします。

CSVをインポートするには、record export コマンドを使用します。

cli-kintone.exe record import^
     –base-url https://{サブドメイン}.cybozu.com^
     –app {レプリカのアプリID}^
     –guest-space-id {レプリカのゲストスペースID}^
     –api-token {レプリカのAPIトークン}^
     –encoding sjis^
     –file-path C:\work\cli-kintone\record.csv^
     –update-key “案件管理No “

※サブドメイン、アプリID、APIトークンなどはご使用の環境に合わせてください

上記の処理をバッチファイルにすると下記の様になります。

cli-kintoneのコマンドで使用するサブドメイン、アプリID、APIトークンなどは、変数定義しておくと後のメンテナンスも楽になります。

@echo off
setlocal
rem ———————————————————
rem 機能名:Kintoneアプリ間データ同期
rem ———————————————————

set batch_path=%~dp0
set logFile=DataSync.log
set csvEncoding=sjis
set exportFile=record.csv

rem ———————————————————
rem オリジナルで使用する変数の設定
rem ———————————————————
set src_baseUrl=https:// {サブドメイン}.cybozu.com
set src_appId={オリジナルのアプリID}
set src_apiToken={オリジナルのAPIトークン}
set src_exportCondition=”作成日時 = TODAY() or 更新日時 = TODAY()”
set exportFields=案件管理No,会社名,部署名,先方担当者,TEL,メールアドレス,案件担当者,見込み時期,確度,製品名,単価,数量,小計 

rem ———————————————————
rem レプリカで使用する変数の設定
rem ———————————————————
set dst_baseUrl= https:// {サブドメイン}.cybozu.com
set dst_appId={レプリカのアプリID}
set dst_guestSpaceId={レプリカのゲストスペースID}
set dst_apiToken={レプリカのAPIトークン}
set dst_updateKey=案件管理No

rem ———————————————————
rem 1.データ同期処理開始
rem ———————————————————
cd /d %batch_path%
call:LOGGER [INF] ■データ同期処理を開始します
rem 前回のエクスポートファイルを削除する
if exist %exportFile% del %exportFile% >> %logFile% 2>&1
if %errorlevel% neq 0 (
    call :LOGGER [ERR] 前回のエクスポートファイル削除中にエラーが発生しました。
    exit /b %errorlevel%
)

rem ———————————————————
rem 2.オリジナルのレコードをCSVにエクスポート
rem ———————————————————
call:LOGGER [INF] コピー元アプリのレコードをCSVにエクスポートします…
call cli-kintone.exe record export^
     –base-url %src_baseUrl%^
     –app %src_appId%^
     –api-token %src_apiToken%^
     –fields %exportFields%^
     –condition %src_exportCondition%^
     –encoding %csvEncoding% > %exportFile% 2>> %logFile%
if %errorlevel% neq 0 (
    call :LOGGER [ERR] CSVエクスポート中にエラーが発生しました。
    exit /b %errorlevel%
)

rem ———————————————————
rem 3.レプリカにCSVをインポート
rem ———————————————————
call:LOGGER [INF] コピー先アプリにCSVをインポートします…
call cli-kintone.exe record import^
     –base-url %dst_baseUrl%^
     –app %dst_appId%^
     –guest-space-id %dst_guestSpaceId%^
     –api-token %dst_apiToken%^
     –encoding %csvEncoding%^
     –file-path %exportFile%^
     –update-key “%dst_updateKey%” >> %logFile% 2>&1
if %errorlevel% neq 0 (
    call :LOGGER [ERR] CSVインポート中にエラーが発生しました。
    exit /b %errorlevel%
)

rem ———————————————————
rem [4]データ同期処理完了
rem ———————————————————
call:LOGGER [INF] ■データ同期処理が完了しました。
exit /b 

rem ———————————————————
rem * ログ出力サブルーチン
rem ———————————————————
:LOGGER
rem ***** 日時成形 *****
set LOG_DATE=%date:~0,10% %time:~0,-3%
rem ***** ログ出力 *****
echo %LOG_DATE%,%1,%2 >> “%logFile%”
echo %LOG_DATE% %1 %2
exit /b 0 

あとは作成したバッチファイルをタスクスケジューラーで定期実行させれば完了です。

3.まとめ 

今回、cli-kintoneを使って、社内スペースとゲストスペース間のデータ同期を、簡単に実装できる方法を紹介しました。 

実際に適用できるかは、要件次第ですが、これを使えば、費用をかけずに、ゲストスペースの制約を回避し、外部ユーザーに案件管理アプリのレコードを参照させることができます。 

cli-kintoneを使えば、自動化やバッチ処理ができるため、kintoneの活用がさらに効率的になります。例えば、アプリレコードの定期バックアップ、他Webサービスとの定期的な連携などが挙げられます。

具体な実装方法などでお困りでしたら、ぜひ弊社までお問い合わせ頂けると幸いです。 

次回は、kintoneAPIを使って、DocuSignやBoxなど、他SaaSと連携する方法について紹介する予定です。 

以上、最後まで読んでいただき誠にありがとうございました。