kintone JavaScript cheatSheet

JavaScriptを使用したkintoneのカスタマイズを行う際、良く利用する記述をチートシートとして纏めました。
私自身の備忘録も兼ねています。

```js:kintone_cheatSheet.js

/**
 * イベント
 */
(function() {

    "use strict";

    kintone.events.on([
        'app.record.index.show',
        'app.record.index.edit.show',
        'app.record.index.delete.submit',
        'app.record.create.show', 'app.record.edit.show',
        'app.record.create.submit', 'app.record.edit.submit',
        'app.record.create.submit.success', 'app.record.edit.submit.success',
        'app.record.index.edit.submit',
        'app.record.detail.show',
        'app.record.detail.delete.submit',
        'app.record.detail.process.proceed',
        'app.record.index.edit.change.<フィールドコード>',
        'app.record.create.change.<フィールドコード>', 'app.record.edit.change.<フィールドコード>'
    ], function(event) {

        var record = event.record;

        // 増殖バグ回避
        if (document.getElementById ('my_index_button') !== null) {
            return event;
        }

        // レコード詳細画面を取得
        var menu = kintone.app.record.getHeaderMenuSpaceElement();

        // レコード一覧のメニューの下側の空白部分の要素を取得する
        var header = kintone.app.getHeaderSpaceElement();

        // レコード一覧画面を取得
        var headerMenu = kintone.app.getHeaderMenuSpaceElement();

        // スペースを取得
        var space = kintone.app.record.getSpaceElement("スペースID");

        // ボタンの設置
        var myIndexButton = document.createElement('button');
        myIndexButton.id = 'my_index_button';
        myIndexButton.innerHTML = '一覧のボタン';
        myIndexButton.className = "button-simple-cybozu geo-search-btn";
        myIndexButton.onclick = function() {
        // クリック処理
        };
        space.appendChild(myIndexButton);

        // ボタンの設置(jQuery)
        $(space).append($('<button id="btnId" class="btn-class">ボタン</button>'));
        $("#btnId").click(function() {
            // クリック処理
        });


        // アプリIDを取得
        var appId = kintone.app.getId();

        // レコードIDを取得
        var recordId = kintone.app.record.getId();

        // 関連レコード一覧の参照先のアプリIDを取得
        var related = kintone.app.getRelatedRecordsTargetAppId('フィールドコード');

        // ルックアップフィールドの参照先のアプリIDを取得
        var looked = kintone.app.getLookupTargetAppId('フィールドコード');

        // フィールド非表示
        kintone.app.record.setFieldShown("フィールドコード", false);

        // フィールドを編集不可へ
        record.フィールドコード.disabled = true;

        // ルックアップ取得を自動で行う
        record.ルックアップ.lookup = true;

        // フィールド要素を取得
        var elements = kintone.app.getFieldElements('フィールドコード');

        // フィールドにエラー表示
        record.フィールドコード.error = 'このエラーメッセージを表示';

        // レコードにエラーを表示
        event.error = 'エラーです！';

        // グループの開閉(true: 開く, false: 閉じる)
        kintone.app.record.setGroupFieldOpen("グループID", true);

        // チェックボックスの比較
        if(record['フィールドコード'].value.indexOf('チェック') > -1){
           alert("チェックOK");
        }

        // チェックボックスの比較(jQuery)
        if(!($(':input[id*=_52655951]')[0].checked)){
           alert("jQueryで比較する際、IDは部分一致で比較");
        }

        // ステータス変更時にステータスを取得する方法
        var status = event.nextStatus.value;

        // Rest API
        var params = {
            app: kintone.app.getId(),
            id: kintone.app.record.getId(),
            query: 'フィールドコード="abc" order by "フィールドコード" asc limit 1'
        };
        kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params).then(function(resp) {
            // 成功時
            alert(resp.records.レコード番号.value);

            // レコードに値をセット
            var record = kintone.app.record.get();
            record.record.フィールドコード.value = '書き換えた文字列';
            kintone.app.record.set(record);

        }, function(error) {
            // 失敗時
            var errmsg = 'レコード取得時にエラーが発生しました。';
            if (error.message !== undefined) {
                errmsg += '\n' + error.message;
            }
            alert(errmsg);
        });

        // Promiseを利用したモダンなアプリの全レコード取得の書き方
        var fetchRecords = function(appId, opt_query, opt_offset, opt_limit, opt_records) {
            var offset = opt_offset || 0;
            var limit = opt_limit || 500;
            var allRecords = opt_records || [];
            var query = opt_query || '';
            var params = {app: appId, query: query + ' order by レコード番号 asc limit ' + limit + ' offset ' + offset};
            return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params).then(function(resp) {
                allRecords = allRecords.concat(resp.records);
                if (resp.records.length === limit) {
                    return fetchRecords(appId, offset + limit, limit, allRecords);
                }
                return allRecords;
            });
        };
        fetchRecords(<アプリID>).then(function(records) {
            console.log(records);
        });

        return event;
    });

})();


/**
 * レコード詳細画面へボタンを設置
 */
(function() {

    "use strict";

    // レコード詳細画面へボタンを設置
    kintone.events.on('app.record.detail.show', function(event) {

      // 増殖バグ回避
      if (document.getElementById ('send_mail_button') != null) {
          return;
      }

      //ボタン作成
      var sendMailButton = document.createElement('button');
      sendMailButton.id = 'regist_comment_button';
      sendMailButton.style.height = '50px';
      sendMailButton.style.width = '200px';
      sendMailButton.style.margin = '0px 10px';
      sendMailButton.innerHTML = ' メール送信 ';
      sendMailButton.className = 'kintoneplugin-button-normal'; // kintone標準のスタイルを反映するためには、右記CSSファイルを読み込むこと https://github.com/kintone/plugin-sdk/blob/master/stylesheet/51-current-default.css

      //ボタン押下イベント
      sendMailButton.onclick = function() {
         if(confirm("メールを送信します。\nよろしいですか？")){
           send_mail(event);
         }else{
          return;
        }
      }

      //ボタン設置
      kintone.app.record.getHeaderMenuSpaceElement().appendChild(sendMailButton);

    });
})();


```