kintoneのテーブルのデータを別アプリから参照しよう

目次

はじめに

別アプリからテーブルのデータをまるごと参照したい方が、実は多いのではないでしょうか?
そんな方々のために、今回はアプリ間でテーブルのデータを参照する方法をまとめました。
さっそく、詳細を見ていきましょう。

環境準備

カスタマイズのイメージ

今回実現したいことは、「出張申請」アプリから「旅費精算申請」アプリの「旅費」テーブルのデータを参照することです。
実現方法として、次の2パターンを紹介したいと思います。

  • パターン1:REST APIを使って参照する。
  • パターン2:標準機能のみで参照する。

パターン1:REST APIを使って参照する

テーブルのデータを参照するのみではなく、次のようなデータ扱いをしたい場合はあると思います。

  • テーブルデータを別のアプリから取得したい。
  • テーブルデータを別のアプリに保存したい。

次は、上記2パターンの自動参照を実現する、JavaScriptカスタマイズを使った方法を紹介したいと思います。

テーブルデータを別のアプリから取得する

しくみ

具体的には、「別アプリからテーブルデータを取得し、詳細画面のスペースフィールドに表示させる」というしくみになります。

今回の例では、「出張申請」アプリのレコード詳細画面が表示されたときに、「旅費精算申請」アプリから「旅費」テーブルのデータを取得し、スペースフィールドに表示させるイメージです。
アプリ間の関係図は次になります。

完成イメージ

適用手順
  • 「出張申請」アプリ

    1. フィールドコードが「出張申請番号」のレコード番号フィールドを追加する。
    2. フィールドコードが「tableSpace」のスペースフィールドをひとつ追加する。
      フィールドコード フィールドの種類 備考
      出張申請番号 レコード番号 「旅費精算申請」レコードを特定するための番号です。
      同じ「出張申請番号」の「旅費精算申請」レコードのテーブルデータを参照し、「出張申請」レコードに反映します。
      tableSpace スペース 取得した「旅費精算申請」のテーブルデータを表示するために利用します。
    3. サンプルプログラムをJavaScriptファイルに保存し、設定画面からファイルを読み込む。
      ファイルの読み込み方法は 「JavaScriptやCSSでアプリをカスタマイズする」 (External link) を参照してください。
    caution
    警告

    スペースフィールドにデータを表示させる場合、表示されたデータは、標準機能で合計値を計算できません。
    スペースフィールドに表示されたデータも含めて、金額の合計値を計算したい場合は、「旅費精算申請」アプリから取得したデータを利用して合計値を算出する処理が必要です。

  • 「旅費精算申請」アプリ

    1. フィールドコードが「出張申請番号」のレコード番号フィールド(必須項目)を追加する。
      フィールドコード フィールドの種類 備考
      出張申請番号 数値 「出張申請」レコードを特定するための番号です。
      同じ「出張申請番号」の「出張申請」レコードに、「旅費精算申請」のテーブルデータを反映します。
      紐つけたい「出張申請」アプリのレコード番号を、こちらに入力します。
      「出張申請アプリ」の「出張申請番号」とフィールドコードを合わせてください。
      「必須項目にする」「値の重複を禁止する」にチェックしてください。
サンプルプログラム

「出張申請」アプリのレコード詳細画面の表示イベントで、「旅費精算申請」アプリから「旅費」テーブルのデータを取得し、「出張申請」アプリのスペースフィールドに表示させる処理です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 * テーブルのデータを別アプリから参照するサンプルプログラム
 * Copyright (c) 2020 Cybozu
 *
 * Licensed under the MIT License
 * https://opensource.org/license/mit/
*/

(() => {
  'use strict';

  kintone.events.on('app.record.detail.show', (event) => {

    // 「旅費精算申請アプリ」のアプリのIDに書き換えてください
    const APP_ID = 123;

    // 「出張申請番号」として利用する「レコード番号」を取得
    const applicationNumber = kintone.app.record.getId();

    // フィールドコードを変数に格納
    const businessTripExpenses = '旅費';
    const date = '旅費日付';
    const transportation = '手段';
    const summary = '旅費摘要';
    const amount = '旅費金額';
    const receipt = '旅費領収書';

    // 「旅費精算申請アプリ」情報を表示する表を作成
    const tableHtml = `<thead><tr>
        <th>${date}</th>
        <th>${transportation}</th>
        <th>${summary}</th>
        <th>${amount}</th>
        <th>${receipt}</th>
      </tr></thead>
    </tbody>`;

    // スペースフィールドに作成した表を表示
    const tableEl = document.createElement('table');
    tableEl.id = 'table';
    tableEl.border = '1';
    tableEl.style.textAlign = 'center';
    tableEl.style.padding = '10px';
    tableEl.insertAdjacentHTML('afterbegin', tableHtml);
    kintone.app.record.getSpaceElement('tableSpace').appendChild(tableEl);

    // 「旅費精算申請アプリ」から「出張申請番号」が同じのレコードを取得
    const params = {
      app: APP_ID,
      query: `出張申請番号 = ${applicationNumber}`
    };
    return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params).then((resp) => {

      const travelExpenseAppRecords = resp.records;

      // 同じ「出張申請番号」のレコードが「旅費精算申請アプリ」に存在しないときにエラーを表示
      if (travelExpenseAppRecords.length === 0) {
        window.alert('「旅費精算申請アプリ」に同じ「出張申請番号」のレコードがないため、「旅費」テーブルのデータを表示できません。');
        return event;
      }

      // 取得した「旅費精算申請アプリ」のテーブルデータを作成した表に格納
      const tableRows = travelExpenseAppRecords[0][businessTripExpenses].value;
      const tableRef = document.getElementById('table');

      tableRows.forEach((row) => {
        const tableRow = tableRef.insertRow(-1);
        const cell1 = tableRow.insertCell(-1);
        const cell2 = tableRow.insertCell(-1);
        const cell3 = tableRow.insertCell(-1);
        const cell4 = tableRow.insertCell(-1);
        const cell5 = tableRow.insertCell(-1);

        cell1.appendChild(document.createTextNode(row.value[date].value));
        cell2.appendChild(document.createTextNode(row.value[transportation].value));
        cell3.appendChild(document.createTextNode(row.value[summary].value));
        cell4.appendChild(document.createTextNode(row.value[amount].value));
        cell5.appendChild(document.createTextNode(row.value[receipt].value));
      });

      return event;

    }).catch((error) => {
      // エラー表示をする
      window.alert(`エラーが起こりました。エラーメッセージ:${error.message}`);
      return event;
    });
  });
})();
動作確認
  1. 「旅費精算申請」アプリに新規レコードを作成し、保存する。
    「旅費」テーブルにデモ用のデータを登録する。
  2. 「出張申請」アプリに新規レコードを作成し、保存する。
    保存後のレコード詳細画面の「tableSpace」スペースフィールドに、「完成イメージ」のようなテーブルが表示されたかどうかを確認する。

テーブルデータを別のアプリに登録する

しくみ

具体的には「レコード保存時に、テーブルデータを参照させたいアプリのテーブルにも登録する」になります。

今回の例では、「旅費精算申請」アプリのレコードを保存するときに「旅費」テーブルのデータを「出張申請」アプリにも保存するイメージになります。
アプリ間の関係図は次になります。

完成イメージ

適用手順
  • 「出張申請」アプリ
    1. フィールドコードが「出張申請番号」のレコード番号フィールドを追加する。
    2. 設定から、取得したデータを格納するためのテーブルを追加する。
      フィールドコード フィールドの種類 備考
      出張申請番号 レコード番号 「旅費精算申請」レコードを特定するための番号です。
      同じ「出張申請番号」の「旅費精算申請」レコードから更新されたテーブルデータを「出張申請」レコードに反映します。
      旅費 テーブル 「旅費精算申請」の「旅費」テーブルと同じものを追加します。
  • 「旅費精算申請」アプリ
    1. フィールドコードが「出張申請番号」のレコード番号フィールドを追加する。
      フィールドコード フィールドの種類 備考
      出張申請番号 数値 「出張申請」レコードを特定するための番号です。
      同じ「出張申請番号」の「出張申請」レコードに、「旅費精算申請」のテーブルデータを反映します。
      紐つけたい「出張申請」アプリのレコード番号を、こちらに入力します。
      「出張申請アプリ」の「出張申請番号」とフィールドコードを合わせてください。
      「必須項目にする」「値の重複を禁止する」にチェックしてください。
    2. サンプルプログラムをJavaScriptファイルに保存し、設定画面からファイルを読み込む。
      ファイルの読み込み方法は 「JavaScriptやCSSでアプリをカスタマイズする」 (External link) を参照してください。
サンプルプログラム

「旅費精算申請」アプリのレコード追加・編集画面の保存成功後イベントで、「旅費精算申請」アプリの「旅費」テーブルのデータを、「出張申請」アプリの「旅費」テーブルにも登録する処理になります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
 * テーブルデータを別のアプリに保存するサンプルプログラム
 * Copyright (c) 2020 Cybozu
 *
 * Licensed under the MIT License
 * https://opensource.org/license/mit/
*/

(() => {
  'use strict';

  // 「出張申請アプリ」のアプリのIDに書き換えてください。
  const APP_ID = 123;

  // フィールドコードを変数に格納
  const businessTripExpenses = '旅費';
  const applicationNumber = '出張申請番号';

  kintone.events.on(['app.record.edit.submit', 'app.record.create.submit'], (event) => {

    // 「旅費精算申請アプリ」のサブテーブルオブジェクトを取得
    const travelExpenseAppRecord = event.record;
    const tableRows = travelExpenseAppRecord[businessTripExpenses].value;

    // 「旅費精算申請アプリ」のサブテーブルオブジェクトを配列に格納
    const subtable = tableRows.map((row) => {
      return {value: row.value};
    });

    // 出張申請アプリから、同じ「出張申請番号」(レコード番号)のレコードを取得
    const paramForGet = {
      app: APP_ID,
      id: travelExpenseAppRecord[applicationNumber].value
    };
    return kintone.api(kintone.api.url('/k/v1/record', true), 'GET', paramForGet).then((resp) => {

      const businessTripAppRecord = resp.record;

      // 「出張申請アプリ」に同じ「出張申請番号」のレコードが存在しないときにエラーを表示
      if (!businessTripAppRecord) {
        window.alert('「出張申請アプリ」に同じ「出張申請番号」のレコードがないため、旅費精算申請データの更新ができません。');
        return event;
      }
      // 取得した出張申請データに旅費精算申請データを更新
      const paramForPut = {
        app: APP_ID,
        id: travelExpenseAppRecord[applicationNumber].value,
        record: {
          // 旅費精算申請データ(サブテーブル)
          旅費: {
            value: subtable
          }
        }
      };

      // データを追加したレコードを「出張申請アプリ」に反映
      return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', paramForPut);

    }).then((resp2) => {
      // 処理成功したときのメッセージ
      window.alert('出張申請アプリに旅費精算申請データを反映しました!');
      return event;

    }).catch((error) => {
      // 処理が失敗したときにエラー表示をする
      window.alert(`出張申請アプリへの反映が失敗しました。\n${error.message}`);
      return event;
    });
  });
})();
動作確認
  1. 「出張申請」アプリに新規レコードを作成し、保存する。
  2. 「旅費精算申請」アプリに新規レコードを作成し、保存する。
    「旅費」テーブルにデモ用のデータを登録する。
  3. 「旅費精算申請」アプリのレコード追加/編集画面を保存する。
  4. 「出張申請アプリに旅費精算申請データを反映しました」のメッセージが表示されたら、1で作成した「出張申請」レコードの「旅費」テーブルに、データが反映されたどうかを確認する。

パターン2:標準機能のみで参照する

JavaScriptを使ったカスタマイズの方法を紹介しましたが、もう少し手軽にできる、標準機能を使った方法についても紹介したいと思います。

アクションボタンを押す作業があるなど、利便性に少し欠ける方法ですが、ノンコーディングでできるので、ご興味のある方はぜひ試してみてください。

しくみ

テーブルとして保存したいデータは、別のアプリに保存しておき、そのアプリから、関連レコード機能を使ってデータを参照する」というしくみになります。

今回の例で使うアプリの場合、次の流れになります。

  • 「旅費明細」アプリを作成する。
  • 「旅費精算申請」アプリのテーブルデータに相当する内容を、「旅費明細」アプリに保存する。
  • 保存された「旅費明細」アプリのデータを「旅費精算申請」「出張申請」アプリから、関連レコードを使って参照する。

アプリ間の関係図は次になります。

「旅費明細」アプリへのデータ登録は、「旅費精算申請」アプリのアクションボタンを使って、1レコードにテーブル1行のデータを保存する、という運用になります。

完成イメージ

適用手順

  • 「旅費明細」アプリ

    1. 「旅費明細」アプリを新規作成する。
      1. 「日付」「手段」「旅費摘要」「金額」「領収書」など、「旅費精算申請」アプリのテーブルデータに相当する内容を保存するためのフィールドを追加する。
      2. フィールド名が「旅費申請番号」の文字列(1行)フィールドを追加する。
      3. 追加するフィールドの詳細は下記を参照してください。
        フィールド名 フィールドの種類 備考
        日付 日付フィールド 旅費の「日付」情報を入力します。
        手段 ドロップダウン 旅費の「手段」情報を入力します。
        旅費摘要 文字列(1行) 旅費の「旅費摘要」情報を入力します。
        金額 数値 旅費の「金額」情報を入力します。
        領収書 チェックボックス 旅費の「領収書」情報を入力します。
        旅費申請番号 文字列(1行) 関連レコードとアクションの関連付けのキーとして利用します。
  • 「旅費精算申請」アプリ

    1. 「旅費」テーブルを削除する。
    2. アクション機能を設定する。
      アクションの設定の「フィールドの関連付け」で、「No」フィールドと「旅費明細」アプリの「旅費申請番号」を関連付けさせる。
      アクションの設定方法はkintoneヘルプ アプリアクションを設定する (External link) を参照してください。
    3. 関連レコード一覧フィールドを追加し、「旅費明細」アプリのデータを参照できるように設定する。
      追加するフィールドの詳細は下記を参照してください。
      フィールド名 フィールドの種類 備考
      旅費明細 関連レコード一覧
      • 参照するアプリ:旅費明細
      • 表示するレコードの条件:このアプリのフィールド「No」と参照するアプリのフィールド「旅費申請番号」
      • 表示するフィールド:「旅費精算申請」アプリに表示させたいフィールド
      • 関連レコードの設定方法詳細はkintoneヘルプ 関連レコード一覧を設定する (External link) を参照してください。
    caution
    警告

    テーブルの代わりに、関連レコード機能で「旅費精算申請」アプリに「旅費」データを表示させる場合、テーブルデータでは行える、標準機能の合計値の計算ができなくなります。
    関連レコードにある金額データも含めて合計値を計算したい場合は、 関連レコードの項目を条件付きで集計 を参照してください。
    「テーブルデータの参照」部分の動作をまず試してみたい方は、「旅費精算申請」の「旅費」テーブルを削除する際に、「旅費合計」計算フィールドも含めて削除してください。

  • 「出張申請」アプリ

    1. フィールドコードが「旅費申請番号」の文字列(1行)フィールドを作成する。
      (関連レコードとアクションの関連付けのキーとして利用)
    2. 関連レコード一覧フィールドを追加し、「旅費明細」アプリのデータを参照できるように設定する。
      追加するフィールドの詳細は下記を参照してください。
      フィールド名 フィールドの種類 備考
      旅費申請番号 文字列(1行) 関連レコードとアクションの関連付けのキーとして利用します。
      旅費明細 関連レコード一覧
      • 参照するアプリ:旅費明細
      • 表示するレコードの条件:このアプリのフィールド「旅費申請番号」と参照するアプリのフィールド「旅費申請番号」
      • 表示するフィールド:「旅費精算申請」アプリに表示させたいフィールド
      • 関連レコードの設定方法の詳細はkintoneヘルプ 関連レコード一覧を設定する (External link) をして参照ください。

おわりに

今回のTipsでは、アプリ間でテーブルのデータを参照する方法を紹介しました。

他にも、データ参照でよく使われる 関連レコードのカスタマイズ テーブルのほかの活用方法など、便利な情報がたくさんありますので、ぜひ確認してみてください。

information

このTipsは、2022年10月版kintoneで動作を確認しています。