kintoneではCSVファイルによる一括登録や更新を行うことができますが幾つか制限があります。
その中の一つに
ルックアップフィールドへの登録/更新ができない
というものがあります。
これができないと、レコードを数百件や数千件登録した状態で、新たにルックアップフィールドを設けたときに非常に困ります。
なんせ、CSVでの更新ができないのですから。。
そうするとブラウザから一件ずつ開いて、編集画面にして、ルックアップして、保存して・・・・といった作業を延々と続けることになってしまい、非現実的です。
実際、私も先日、お客様からサンプルデータを頂いたのですが、その中にルックアップフィールドがあって、レコード数も200件以上。。かるく途方にくれました。
REST APIでルックアップフィールドを更新
そこで、kintoneのREST APIではルックアップフィールドへの登録や更新ができることを思い出し、早速試してみました
今回もJavaで実装しましたので、サンプルコードはいつもどおりJavaでご紹介します。
基本的な部分は、「JavaでkintoneのREST APIを使ってみる【データ更新編】 」を参照してください。
また、カスタマイズはしたいけれど自分だけではできないという方は、カスタマイズ開発を1週間20万円という定額料金で提供していますので、弊社までお気軽にお問い合わせください。
では、サンプルコードです。
import java.io.IOException;
import com.cybozu.kintone.database.Connection;
import com.cybozu.kintone.database.Record;
import com.cybozu.kintone.database.ResultSet;
import com.cybozu.kintone.database.exception.DBException;
public class update2Kintone {
public static void main(String[] args) throws IOException {
Connection db = null;
try {
db = new Connection("サブドメイン名", "ログイン名", "パスワード");
System.out.println("kintoneへ接続しました");
} catch (Exception e) {
System.err.println("kintoneへの接続に失敗しました。" );
e.printStackTrace();
System.exit(1);
}
ResultSet rs = null;
try {
String query = "title like \"ジョイゾー\" and updated_time <= TODAY()"; //検索文字列
rs = db.select("アプリID", query, null); //データ検索を実行し、結果をResultSetにセット
} catch (DBException e) {
System.err.println("kintoneからのデータ取得に失敗しました。");
e.printStackTrace();
}
Record record = new Record(); //レコードオブジェクト
long record_id = 0; //変更対象のレコードID
while (rs.next()) {
record_id = rs.getId(); //更新時のキーとなるレコードIDを収得
record.setString("ルックアップフィールドコード", "値"); //ルックアップフィールドはsetStringを使う
//kintoneにデータ登録
try {
db.update("アプリID",record_id, record);
} catch (DBException e) {
System.err.println("kintoneへデータアップロードに失敗しました。");
e.printStackTrace();
}
}
db.close(); //kintone切断
}
}
ルックアップフィールドもJSONで指定する形式は文字列型と一緒ですので、 setString メソッドを利用します。
record.setString("ルックアップフィールドコード", "値"); //ルックアップフィールドはsetStringを使う
CSVで一括更新したい場合もちょこっとプログラミングをすれば、簡単に登録/更新ができると思います。
ただ、REST APIで更新する際には一点だけ注意点があります。
ルックアップに関連付けるアプリのコピー元フィールドの設定が「重複禁止」設定になっている必要があります。
例えば、案件管理と商品マスタをルックアップしていて、案件管理の設定で商品マスタの商品名をコピー元フィールド(キーフィールド)として設定し、商品単価を取得しているとします。
この場合、コピー元フィールドとして設定されている商品マスタ側の「商品名」フィールドの設定が以下のように「値の重複を禁止する」にチェックが入っていなければいけません。

これは、ブラウザからルックアップする際には複数候補があっても別ウインドウで候補の一覧を出してそこから選べますがAPIの場合は複数候補が出た場合に判断ができないためで、重複登録が絶対にない状態でないと動かせないようにAPIの仕様で決めたのだと思います。
ですので、もし一括で更新したいルックアップフィールドが重複登録OKのフィールドの場合は、別途重複登録NGなフィールドを作成していただくなどの対応が必要になります。
ルックアップフィールドを一括で登録/更新したいというニーズは多いと思いますので、ここは製品に組み込まれるのを待ちつつ、現状は独自開発で切り抜けましょう(笑)