0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

kintone で JavaScript プログラムを作るための雛形

Posted at

kintone で JavaScript プログラムを新規で作ることがあって、そのための雛形を記述します。

想定としては、ABC 画面の現在のステータス表示が「請求書印刷」だったとして、DEF 画面の「受注日」と「発注書送付日」が入力されている条件で、指定されたステータス(「発注書印刷」に戻す)に更新します。

フラグ変更は、単にチェックボックスのオン/オフを切り替えます(印刷済みを外す)。

ステータス表示やフラグ表示は編集不可(disabled=true)にしていることがあるので、本プログラムで強制的に変更できるようにします。
 

100_新しいツール_Config.js
/**
 * @fileoverview 新しいツール_Config.js 設定情報を保持する
 */
(() => {
  // 自フィールドと、他のアプリのフィールドを定義します
  // option は、ここでは定義していますが、処理では必ずしも使用されていません

  window.company = window.company || {};
  window.company.config = {
    FIELDS: {
            内容: { id: '内容', option1: 'ステータス変更', option2: 'フラグ変更' },

            ステータス変更_該当アプリ: { id: 'ステータス変更_該当アプリ' },
            ステータス変更_該当レコード: { id: 'ステータス変更_該当レコード' },
            現在のステップ: { id: '現在のステップ' },

            フラグ変更_該当アプリ: { id: 'フラグ変更_該当アプリ' },
            フラグ変更_該当レコード: { id: 'フラグ変更_該当レコード' },
            請求書印刷: { id: '請求書印刷', option: '' },
    },
    RELATED: {
      ABC: {
            論理削除: { id: '論理削除', option: '' },
            受付番号: { id: '受付番号' },
            現在のステップ: { id: '現在のステップ' },
      },
      DEF: {
            論理削除: { id: '論理削除', option: '' },
            受付番号: { id: '受付番号' },
            受注日: { id: '受注日' },
            発注書送付日: { id: '発注書送付日' },
            請求書印刷: { id: '請求書印刷', option: '' },
      },
    },
    AppNameToIdMap: {
      "ABC(dev)": 11,
      "DEF(dev)": 12,
      "ABC": 123,
      "DEF": 124,
    },
  }
})();

110_新しいツール_Save.js
/**
 * @fileoverview 新しいツール_Save.js 新規保存または編集保存時に指定された値に更新する
 */
(() => {
  const CONFIG = window.company.config;

  kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], async (event) => {
    const record = event.record;
    const maintType = record[CONFIG.FIELDS.内容.id].value;

    /**
     * ステータス変更
     */
    if (maintType === 'ステータス変更') {
      const targetApp = record[CONFIG.FIELDS.ステータス変更_該当アプリ.id].value;
      const targetRecordIdsRaw = record[CONFIG.FIELDS.ステータス変更_該当レコード.id].value;
      const newStatus = record[CONFIG.FIELDS.現在のステップ.id].value;

      if (!targetApp || !targetRecordIdsRaw) {
        event.error = "ステータス変更する該当アプリと該当レコードを入力してください。";
        return event;
      }

      // カンマ区切りのIDを配列に変換
      const targetRecordIds = targetRecordIdsRaw.split(',').map(id => id.trim()).filter(id => id);

      try {
        for (const targetRecordId of targetRecordIds) {

          // 現在の状態
          const targetBody = {
            app: CONFIG.AppNameToIdMap[targetApp],
            id: targetRecordId,
          };
          const targetResp = await kintone.api(kintone.api.url('/k/v1/record.json', true), 'GET', targetBody);
          const targetRecord = targetResp.record;

          const currentNumber = targetRecord[CONFIG.RELATED.ABC.受付番号.id].value;
          const currentStatus = targetRecord[CONFIG.RELATED.ABC.現在のステップ.id].value;

          // 条件確認
          const condApp = (targetApp === "ABC(dev)") ? "DEF(dev)" : ((targetApp === "ABC") ? "DEF" : null);

          const condBody = {
            app: CONFIG.AppNameToIdMap[condApp],
            query: `受付番号 = "${currentNumber}" and 論理削除 not in ("済")`,
          };
          const condResp = await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', condBody);

          if (!condResp.records || condResp.records.length === 0) {
            event.error = `同じ受付番号の ${condApp} のレコードが見つかりませんでした。(受付番号: ${currentNumber})`;
            return event;
          }
          if (condResp.records.length > 1) {
            event.error = `同じ受付番号で ${condApp} のレコードが複数見つかりました。(受付番号: ${currentNumber})`;
            return event;
          }
          const condRecord = condResp.records[0];
          const isSalesConfirmed = condRecord[CONFIG.RELATED.DEF.受注日.id] && condRecord[CONFIG.RELATED.DEF.受注日.id].value.length > 0;
          const isDestinationConfirmed = condRecord[CONFIG.RELATED.DEF.発注書送付日.id] && condRecord[CONFIG.RELATED.DEF.発注書送付日.id].value.length > 0;

          // アップデート
          if (currentStatus === '請求書印刷' && isSalesConfirmed && isDestinationConfirmed) {
            const putBody = {
              app: CONFIG.AppNameToIdMap[targetApp],
              id: targetRecordId,
              record: {
                [CONFIG.RELATED.ABC.現在のステップ.id]: {
                  value: newStatus
                }
              }
            };
            await kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', putBody);
          } else {
            event.error =  `更新条件を満たしていません。現在のステータスが「請求書印刷」であり、「DEF 受注日」と「DEF 発注書送付日」が記入されている必要があります。(案件番号: ${currentNumber})`;
            return event;
          }
        }
        if (targetRecordIds.length > 0) {
          kintone.app.getHeaderSpaceElement().innerText = "ステータス変更が正常に完了しました。";
        }      
      } catch (e) {
        event.error = 'レコードの取得または更新中にエラーが発生しました: ' + e.message;
        return event;
      }

    /**
     * フラグ変更
     */
    } else if (maintType === 'フラグ変更') {
      const targetApp = record[CONFIG.FIELDS.フラグ変更_該当アプリ.id].value;
      const targetRecordIdsRaw = record[CONFIG.FIELDS.フラグ変更_該当レコード.id].value;
      const newStatus = record[CONFIG.FIELDS.請求書印刷.id].value;

      if (!targetApp || !targetRecordIdsRaw) {
        event.error = "フラグ変更する該当アプリと該当レコードを入力してください。";
        return event;
      }

      // カンマ区切りのIDを配列に変換
      const targetRecordIds = targetRecordIdsRaw.split(',').map(id => id.trim()).filter(id => id);

      try {
        for (const targetRecordId of targetRecordIds) {

          // アップデート
          const putBody = {
            app: CONFIG.AppNameToIdMap[targetApp],
            id: targetRecordId,
            record: {
              [CONFIG.RELATED.DEF.請求書印刷.id]: {
                value: newStatus
              }
            }
          };
          await kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', putBody);
        }      
        if (targetRecordIds.length > 0) {
          kintone.app.getHeaderSpaceElement().innerText = "フラグ変更が正常に完了しました。";
        }
      } catch (e) {
        event.error = 'レコードの取得または更新中にエラーが発生しました: ' + e.message;
        return event;
      }    
    } else {
      //
    }

    return event;
  });
})();

画面イメージ

[ラジオボタン]内容 ● ステータス変更 〇 フラグ変更

[文字列(1行)]ステータス変更_該当アプリ ␣␣ABC(dev) 
[文字列(1行)]ステータス変更_該当レコード ␣␣␣␣␣␣ (カンマ区切りで複数指定できます)
[ドロップダウン]現在のステップ 「発注書印刷」

[文字列(1行)]フラグ変更_該当アプリ ␣␣DEF(dev) 
[文字列(1行)]フラグ_該当レコード ␣␣␣␣␣␣ (カンマ区切りで複数指定できます)
[チェックボックス]請求書印刷 □ 済

 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?