kintone (キントーン) は、業務などで手軽に使えるWebデータベースアプリを提供しています。

簡易的な操作であれば、標準で提供されているビューワーアプリで十分ですが、デバイスの機能を使ったり、こだわったインターフェースを使いたい時には独自のアプリを開発することになります。

今回はkintoneアプリの一つ、顧客リストアプリのデータをMonacaアプリとして呼び出し、操作する手順を解説します。

※ 本記事の中では、Monaca有料プランでのみ利用できる機能を利用しています。

今回作成するプロジェクト

記事で紹介するプロジェクトは、下のプロジェクトインポートリンクから
ご利用のMonacaアカウントへインポートできます。

(https://monaca.mobi/ja/directimport?pid=622aec8ce788859d6a886b6f)

アプリ仕様について

今回は、Framework7をフレームワークとして利用します。

画面は次の通りです。最初に読み込まれるのはログイン画面です。

const routes = [
  // ログイン
  {
    path: '/login',
    name: 'Login',
    componentUrl: './pages/login.html'
  },
  // 顧客一覧画面
  {
    path: '/customers',
    name: 'Customers',
    componentUrl: './pages/customers.html'
  },
  // フォーム画面
  {
    path: '/form',
    name: 'Form',
    componentUrl: './pages/form.html'
  },
  // Default route (404 page). MUST BE THE LAST
  {
    path: '(.*)',
    url: './pages/404.html',
  },
];

kintoneの変数定義

以下の変数が、kintone操作用の変数です。
これは js/app.js の中で定義しています。

KINTONE_DOMAIN、KINTONE_APP_IDはそれぞれ自身のものに書き換えてください。

// kintoneのドメイン
const KINTONE_DOMAIN = 'example.cybozu.com';
// kintoneアプリのID
const KINTONE_APP_ID = '3';

ログイン処理

kintoneでは、最初にID/パスワードによるログインを行います。

ログインについては前回の記事を踏襲しています。
前回の記事は、こちらを参照してください。



(https://press.monaca.io/atsushi/9045)

この時、認証だけを行うAPIはないので、ログイン情報を使って任意のAPI(今回はアプリ情報を取得するAPI)を実行して、結果が返ってくるかどうかで認証の成否を判定しています。

認証が成功すると、一覧画面に遷移します。

// ログインボタンを押した時の処理
const login = async () => {
    // ボタン上にローディングを表示
    load()

    // 入力値を受け取る
    const username = $f7.$el.find('#username').val();
    const password = $f7.$el.find('#password').val();

    // APIリクエスト用のヘッダー文字列作成
    window.AUTH = ${username}:${password};
    try {
        // APIリクエスト
        const res = await getApp({ id: KINTONE_APP_ID });

        // レスポンスで認証情報の正しさを判定
        const text = res.data.appId === KINTONE_APP_ID ? 'ログインしました' : res.message;

        // ボタン上に表示されるローディングを非表示
        unload()

        // 一覧画面へ遷移する
        $f7router.navigate({ name: 'Customers'});
    } catch (e) {
        console.log(e.message);
    }
};

顧客一覧画面

顧客一覧画面では、kintone上のレコードを取得し、一覧形式で表示させます。

右上の更新ボタンを押したタイミングで、kintoneへ問合せてデータを読み込む形にしています。

顧客レコードを複数行表示するため、次に解説する 「レコードの一括取得API」 を呼出します。

kintoneレコードの一括取得

顧客一覧画面では、顧客レコードを複数行表示するため、次のレコード一括取得APIを呼出します。
(APIの詳細はこちら)

URI HTTPメソッド
https://(サブドメイン名).cybozu.com/k/v1/records.json GET

APIを呼び出す際に利用できるパラメータは次のとおりです。

どのアプリかを指定する「app」のみが、必須のパラメータです。

パラメータ名 指定する値 必須 説明
app 数値 or 文字列 アプリのID
fields 文字列の配列 x レスポンスに含めるフィールドコードを指定します。
省略時は、閲覧権限を持つすべてのフィールドの値が返されます。
query 文字列 x レスポンスに含めるレコードの条件を指定するクエリ文字列です。
クエリ文字列内では、演算子とオプションが使用できます。
省略時は、閲覧権限を持つすべてのレコードが返されます。
totalCount 真偽値 or 文字列 x 「query」パラメータで指定した条件にあてはまるレコードの件数を取得する場合、「true」を指定します。
省略時は、レスポンスにはtotalCountの値としてnullが返されます。

顧客データの取得

// kintoneから顧客データを読込む
const getCustomers = (params) => {
  const options = {
    method: 'get',
    params: params,
  };
  return sendRequest('/records.json', options);
}

データの取得ができたら、結果を一覧で表示します。

getCustomersの結果にあるrecordsを描画します。

この時、ユニークキーになるのが $id.value になります。

一覧画面で data-id としてユニークキーを設定した値です。

const showCustomers = (records) => {
    $f7.$el.find('.customers tbody').html(records.map(r => `
      <tr data-id=${r.$id.value}>
        <td>${r.$id.value}</td>
        <td>${r['会社名'].value}</td>
        <td>${r['担当者名'].value}</td>
      </tr>
    `).join(''));
};

一覧画面からの画面遷移

顧客一覧をタップしたら、フォーム画面に遷移します。

一覧画面にて設定したユニークキーを使ってタップされたデータを特定し、
フォーム画面にpropsとして渡しています。

const bindCustomers = (records) => {
    $f7.$el.find('.customers tbody tr').on('click', e => {
      const id = $(e.target).parents('tr').data('id');
      const record = records.find(r => r.$id.value === id);

      $f7router.navigate({
        name: 'Form',
      }, {
        props: {
          record,
        },
      });
    });
  }

フォーム表示

フォーム画面では、顧客一覧画面からレコードデータが送られている場合は、その情報を使います。

新規作成の場合は、Props がないので、空のオブジェクトを定義します。

export default (props, { $f7, $f7router }) => {
  const record = props.record || {};
    // 省略
}

データを画面表示する際には、常にキーの存在チェックをし、キーがある場合には、そのキーの value プロパティを表示します。
下の例は、キー「会社名」の確認をしています。

<input
    type="text"
    id="company"
    placeholder="会社名"
    value="${record['会社名'] ? record['会社名'].value : ''}"
/>

データの登録

データを新規保存、または更新する際には、まずkintoneのフォーマットに合わせたデータを作成します。

const company = $f7.$el.find('#company').val();
const account = $f7.$el.find('#account').val();
const params = {
    '会社名': {
        value: company,
    },
    '担当者名': {
        value: account,
    },
};

次に、kintoneのレコードにおけるユニークキーである $id の有無によって更新と新規作成を分けます。

$idが存在している場合は、既にレコードがkintone上にあるため、更新の処理を行います。

$idが存在しない場合は、まだkintone上にレコードが無いため、新規作成となります。

    let res;
    if (record.$id) {
        // 更新
        res = await updateRecord({
            app: KINTONE_APP_ID,
            id: record.$id.value,
            record: params,
        });
    } else {
        // 新規作成
        res = await addRecord({
            app: KINTONE_APP_ID,
            record: params,
        });
    }

処理の結果は、revisionというデータがあれば保存成功です。

revisionが存在しない場合は、何らかのエラーが発生しています。

const text = res.data.revision ? '保存しました' : res.message;

ここまでで基本的なkintoneのデータ操作は完了です。

データ登録のAPI

上記の説明にて出てきた関数「addRecord」や「updateRecord」は、kintoneのレコード登録/更新APIを呼びだし、処理を実行しています。

新規登録

レコードの新規登録は、次のAPIを利用しています。

APIの詳細については、こちらを確認ください。

メソッド URL
POST https://(サブドメイン名).cybozu.com/k/v1/record.json

APIに送信するパラメータは次のとおりです。

パラメータ「app」で、どのアプリを対象に、どのようなデータを新規で登録するかを指定します。

パラメータ名 指定する値 必須 説明
app 数値 or 文字列 アプリの ID を指定します。
record Object レコードの情報 (フィールドコードとフィールドの値) をオブジェクトで指定します。

更新

レコードの更新は、次のAPIを利用します。

APIの詳細については、こちらを確認ください。

メソッド URL
PUT https://(サブドメイン名).cybozu.com/k/v1/record.json

APIに送信するパラメータは、次のとおりです。

新規登録のAPIのパラメータに追加でパラメータ「id」を指定することで、
どのレコードを更新対象とするか指定します。

パラメータ名 指定する値 必須 説明
app 数値 or 文字列 アプリの ID を指定します。
id 数値 or 文字列 レコードID を指定します。
record Object レコードの情報 (フィールドコードとフィールドの値) をオブジェクトで指定します。

まとめ

kintoneアプリのデータを取得したり、登録したりするのは慣れれば難しくないでしょう。

外部システムと連携したり、よりスマホやタブレットから便利に使うために、Monacaアプリからkintoneのデータを利用してください。