Help us understand the problem. What is going on with this article?

kintoneのテーブルをルックアップしてみた

はじめに

kintoneのテーブルは標準機能ではルックアップでもってくることはできません(;^ν^)ぐぬぬ…
でもテーブルもごそっと持ってきたい時があるんです!!!

なので kintone REST API を使って疑似ルックアップ拡張してみました。

完成イメージ

table_lookup.gif
※ルックアップクリアがなんか残ってるけど、、(゚ε゚)キニシナイ!!
※↑ 後ほど理由を説明します

仕組み

ルックアップをした時、つまり「ルックアップフィールドが変わった時」「ルックアップの取得ボタンを押した時」っていうイベントがあればなんの造作もないのですが、
どちらもイベントが用意されていないので、「ルックアップで持ってきたフィールドのチェンジイベント」で処理を発火させています🔥🔥

ここのイベントがほしいんじゃー!!(ないものねだり)
2018-09-05_18h47_34.png

ルックアップ元(マスタアプリ)のアプリIDを取得するAPIはあるので、ルックアップの標準機能でどのレコードIDからルックアップしてきてるか取得してREST APIのGETを実行しています。
※ そしてこの「レコードID格納用フィールド」のチェンジイベントで🔥しています

kintoneアプリ

フィールド構成

フィールド フィールドコード 用途
ルックアップ Lookup ルックアップするため
数値 Number ルックアップ元のレコードIDを格納
テーブル Table もってきたいテーブル

テーブルの構成、フィールドコードはルックアップ元/先で同じ にしてください。あとで楽です。

その他必要なフィールドがあれば自由に配置してください。

フィールド配置

配置が地味に大事だったりします!

ルックアップで持ってくるフィールドは上から(左上)から順番に取得するっぽくて、
レコードIDを格納するフィールドを上に持ってくるとちょっとバグります。

change イベントを紐づけている レコードIDフィールド に先に値が入ってしまうのでカスタマイズが動いてしまい、他のフィールドには値が入らないのです。
-> 再度、取得ボタンを押せば、他のフィールドにも値が入ります。

table_lookup2.gif

コード内にある kintone.app.record.set() が原因な気がしますね~(勘)

なのでチェンジイベントさせているレコードIDフィールドを一番下に持ってくるとうまいことできるようになります。

table_lookup3.gif

※ルックアップクリアが残るやつもなんとかなってる

コード

GitHubに置いてあります。

(function() {
  'use strict';
  const events = [
    'app.record.create.change.Number',
    'app.record.edit.change.Number',
  ];
  kintone.events.on(events, function(event) {
    const targetAppId = kintone.app.getLookupTargetAppId('Lookup');
    const targetRecordId = event.record['Number'].value;

    // ルックアップクリアをしたらテーブルを空にする
    if (!targetRecordId) {
      event.record['Table'].value = [];
      return event;
    }

    const body = {
      app: targetAppId,
      id: targetRecordId,
    };
    kintone.api(kintone.api.url('/k/v1/record', true), 'GET', body, function(resp) {
      event.record['Table'].value = resp.record['Table'].value;

      // サブテーブルを編集不可にする場合
      event.record['Table'].value.forEach(function(obj) {
        Object.keys(obj.value).forEach(function(params) {
          obj.value[params].disabled = true;
        });
      });

      kintone.app.record.set(event);
    }, function(err) {
      window.alert('REST APIでエラーが発生しました');
    });
  });
})();

ルックアップクリアさせたらテーブルを空にする処理だったり、サブテーブルを編集不可にしたりしてます。

また、テーブルの構成やフィールドコードを合わせることで、

event.record['Table'].value = resp.record['Table'].value

でテーブルがごそっと持ってこれます。あら楽ちん

おわりに

簡単なカスタマイズでもなるべくQiitaにあげようと思い作ってみました。
テーブルのルックアップは地味にニーズあるのでいつか標準対応してくれるといいな~
(そうなったらこのカスタマイズはお蔵ですけどね笑)

kintoneのカスタマイズで困ったことがあれば cybozu developer network のコミュニティで質問してみると良いですよ~!

それでは!≧(+・` ཀ・´)≦

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away