ワンクリックで一括承認をしてみよう

著者名:北川 恭平(サイボウズ)

目次

はじめに

今回は、 複数のレコードのステータスを更新する API を使って、複数のレコードのステータスの更新をボタンクリック 1 回で実行してみたいと思います。

準備

シナリオとしては、ステータスが「申請中」で作業者が「ログインユーザー」のレコードで絞り込んだ後に、一括承認するというシーンを想定します。

使うアプリはどのアプリでも問題ないですが、今回はアプリストアの中から「旅費清算申請」を選びます。

絞り込みの設定を以下のようにしておきます。

これで準備は完了です。

JavaScript カスタマイズ

今回利用するソースコードは、次の approval-button.js です。
いたってシンプルな処理となっています。
適用する際は、11 行目の ID の箇所を自身の環境の一覧の ID に書き換えてください。
その際シングルクオートで囲む必要はありません。

一覧の ID は、イベントオブジェクト内もしくは URL にて確認してください。
view に続く番号が一覧の ID になります。
例:https://sample.cybozu.com/k/13327/?view=5341206

 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
/*
 * ワンクリックで一括承認するプログラム
 * Copyright (c) 2016 Cybozu
 *
 * Licensed under the MIT License
*/
(() => {
  'use strict';
  kintone.events.on('app.record.index.show', (event) => {
    const appId = kintone.app.getId();
    if (event.viewId !== ID) {
      return event;
    }
    const el = kintone.app.getHeaderSpaceElement();
    if (el.querySelector('.header-contents')) {
      return event;
    }
    const headerDiv = document.createElement('div');
    headerDiv.className = 'header-contents';
    // make a button for approval.
    const balusButton = document.createElement('button');
    balusButton.className = 'approval-button';
    balusButton.textContent = '一括承認!';
    balusButton.addEventListener('click', () => {
      if (event.records.length > 0) {
        window.swal({
          title: '本当に全て承認して大丈夫ですか?',
          text: '表示されているレコードを全て承認します',
          type: 'warning',
          showCancelButton: true,
          confirmButtonColor: '#DD6B55',
          confirmButtonText: '承認!',
          cancelButtonText: 'やっぱりやめる',
          closeOnConfirm: false
        },
        () => {
          const records = event.records.map(record => ({
            id: record.$id.value,
            action: '承認'
          }));
          const requestObj = {
            app: appId,
            records: records
          };
          kintone.api(kintone.api.url('/k/v1/records/status', true), 'PUT', requestObj, () => {
            window.swal({
              title: '承認に成功しました!',
              text: 'お疲れ様でした。',
              // eslint-disable-next-line max-nested-callbacks
              type: 'success'}, () => {
              location.reload();
            });
          });
        });
      } else {
        window.swal({
          title: '申請中のレコードがありません',
          type: 'warning'
        });
      }
    });
    headerDiv.appendChild(balusButton);
    headerDiv.appendChild(document.createElement('br'));
    el.appendChild(headerDiv);

    return event;
  });
})();

以下は処理の流れです。

  1. 11 行目 の処理で、一覧 ID によってボタンを出すか出さないを制御します。
    すべての一覧に出したい場合は不要です。
  2. 21 行目 の処理で、ボタンを生成します。
    22 行目 の処理で、装飾するようにクラス名を与えておきます。
  3. 26 行目 からの処理で、 Cybozu CDN にもある SweetAlert を使って、確認ダイアログを出します。
  4. 45 行目 からの処理で、レコードのステータス更新 API を使って、画面に表示されている全レコードに対して「承認リクエスト」を送ります。
  5. 62 行目 の処理で生成したボタンを、 レコード一覧のメニューの下側の要素を取得する を参考に、レコード一覧メニューの下側の空白部分に追加します。

CSS カスタマイズ

以下の CSS approval-button-design.css を使ってボタンを中央に寄せます。

1
2
3
4
.header-contents{
  border: 1px dashed #D8D8D8;
  text-align: center;
}

JavaScript / CSS ファイルを適用

サンプルコード approval-button.jsapproval-button-design.css と合わせて、 Cybozu CDN にある SweetAlert も読み込みます。

JavaScript

  • SweetAlert v1.1.3
    • https://js.cybozu.com/sweetalert/v1.1.3/sweetalert.min.js
  • アップロードして追加
    • approval-button.js

CSS

  • SweetAlert v1.1.3
    • https://js.cybozu.com/sweetalert/v1.1.3/sweetalert.css
  • アップロードして追加
    • approval-button-design.css

JavaScript と CSS を適用すると、中央にボタンが表示されます。

動作確認

では実際にいくつかのレコードを用意して、承認してみたいと思います。

ボタンを押して実行してみましょう。
実行した結果がこちら。

実際に、一覧で表示されているレコードがすべて承認されました!

ステータス欄が、ステータスによって色が変わっていますがこれは「 条件書式プラグイン」を適用しています。
サンプルコードのみの場合、色は変わらないのでご注意ください。

注意事項

  • 一覧で絞り込み設定をせずに、「申請中」以外のものを出して実行するとエラーになります。

終わりに

今回は、レコード一括承認を試してみました。
一括で承認するのがちょっとこわいので、選択式にしたいという方はこちらの ブログ (External link) にアイディアを書いていますのでご参考ください。

また、実際に使う場合は承認ボタンを使えるユーザーを制御したりする必要があるかと思います。
ユーザー情報をエクスポートする API を利用することでそういった制御もできるかと思いますので、ぜひチャレンジしてみてください。

information

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