技術トレンド

2025/05/07

【kintone】フィールドコードを一括変更するプログラム全文を公開

  • GAS

  • kintone

  • 業務自動化

TOP+スポット

【kintone】フィー...

Note

kintoneのフィールドコードをGoogleスプレッドシートとGASを使って一括で変更する手順を解説します。

kintoneの設定作業で頭を悩ませていたのが「フィールドコードの編集作業」。

フィールドをデータベースのテーブルに見立ててテーブル定義を行い、CSVでアプリを構築することでフィールドは一括作成が可能ですが、フィールドコードを1つずつ編集するのが本当に面倒でした。

100個前後のフィールドであれば、気合を入れて1つずつ設定をしていたのですが、フィールドが450個必要な案件に出会い、「フィールドコードを一括編集できないのか?」というシンプルな問いに重い腰が上がりました。

前提条件

  • kintoneアカウントがあり、APIトークンが取得可能であること

  • GoogleスプレッドシートとGASを使用できること

手順

1. kintoneのAPIトークンを取得

1-1. kintoneの対象アプリを開き、アプリの設定画面に移動

1-1. kintoneの対象アプリを開き、アプリの設定画面に移動

1-2. 設定タブを開き、「APIトークン」を選択

1-2. 設定タブを開き、「APIトークン」を選択

1-3. APIを生成後、「アプリ管理」のチェックを選択してから「保存」ボタンをクリック
(作成したAPIトークンは後ほどGASで利用するためコピーしておく)

1-3. APIを生成後、「アプリ管理」のチェックを選択してから「保存」ボタンをクリック

2. Googleスプレッドシートの準備

2-1. 新しいスプレッドシートを作成し、「フィールド情報」というシートを作成。1行目の項目名を以下のように入力してください。

<項目名>
フィールド名,現在のフィールドコード,新しいフィールドコード,フィールドタイプ
2-1. 新しいスプレッドシートを作成し、「フィールド情報」というシートを作成。1行目の項目名を以下のように入力してください。

3. Google Apps Scriptのセットアップ

3-1. スプレッドシートのメニューから「拡張機能」→「Apps Script」を選択

3-1. スプレッドシートのメニューから「拡張機能」→「Apps Script」を選択

3-2. 以下のコードをコピーし、Apps Scriptエディタに貼り付けます。

// kintoneのドメイン、アプリID、APIトークンを設定
const KINTONEDOMAIN = 'yourdomain'; // 例: 'example.cybozu.com'
const APPID = 'yourapp_id';
const APITOKEN = 'yourapi_token';

// スプレッドシートのシート名
const SHEET_NAME = 'フィールド情報';

/**
* kintoneからフィールド情報を取得し、スプレッドシートに一括出力する関数
*/
function exportCurrentFieldsToSheet() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  
  if (!sheet) {
    SpreadsheetApp.getActiveSpreadsheet().insertSheet(SHEET_NAME);
  }

  sheet.clear();

  // 見出し行の設定
  const headers = ['フィールド名', '現在のフィールドコード', '新しいフィールドコード', 'フィールドタイプ'];

  sheet.appendRow(headers);

  const url = `https://${KINTONEDOMAIN}/k/v1/app/form/fields.json?app=${APPID}`;

  const options = {
    method: 'get',
    headers: {
      'X-Cybozu-API-Token': APITOKEN
    }
  };

  // kintoneからフィールド情報を取得
  const response = UrlFetchApp.fetch(url, options);
  const data = JSON.parse(response.getContentText());

  // スキップするフィールドの配列
  const skipFields = ['カテゴリー', 'レコード番号', '作業者', '更新者', '作成者', 'ステータス', '更新日時', '作成日時'];

  // フィールドデータを配列に格納
  const rows = [];
  for (const fieldCode in data.properties) {
    const field = data.properties[fieldCode];
    
    // スキップするフィールドでなければ追加
    if (!skipFields.includes(field.label)) {
      rows.push([field.label, field.code, '', field.type]);
    }
  }

  // 一度にデータをスプレッドシートに出力
  if (rows.length > 0) {
    sheet.getRange(2, 1, rows.length, headers.length).setValues(rows);
  }
}

/**
* スプレッドシートから情報を読み取り、kintoneのフィールドコードを一括更新する関数
*/
function updateFieldCodesByFieldName() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  const data = sheet.getDataRange().getValues();

  // 既存のフィールド情報を取得し、フィールド名をキーとしたオブジェクトに格納
  const existingFields = {};
  for (let i = 1; i < data.length; i++) {
    const [fieldName, fieldCode, , fieldType] = data[i];
    
    // 空でない行のみを処理対象とする
    if (fieldName && fieldCode && fieldType) {
      existingFields[fieldName] = { code: fieldCode, type: fieldType };
    } else {
      Logger.log(`スキップ: 行 ${i+1} に空のフィールド名、フィールドコード、またはフィールドタイプが含まれています`);
    }
  }

  const propertiesToUpdate = {};
  for (let i = 1; i < data.length; i++) {
    const [fieldName, , newFieldCode, newFieldType] = data[i];
    
    // フィールド名で一致した場合、かつフィールドタイプが同じ場合にのみ更新
    if (existingFields[fieldName]) {
      if (existingFields[fieldName].type === newFieldType) {
        propertiesToUpdate[existingFields[fieldName].code] = {
          code: newFieldCode,
          label: fieldName,
          type: newFieldType,
          required: false // 必須設定が必要な場合はtrueに変更
        };
      } else {
        Logger.log(`スキップ: フィールド「${fieldName}」のタイプが一致しません。既存のタイプ:${existingFields[fieldName].type}、指定されたタイプ:${newFieldType}`);
      }
    } else {
      Logger.log(`スキップ: フィールド名「${fieldName}」が既存フィールドに見つかりません`);
    }
  }

  if (Object.keys(propertiesToUpdate).length === 0) {
    Logger.log("更新するフィールドがありません。スプレッドシートのデータを確認してください。");
    return;
  }

  const url = `https://${KINTONEDOMAIN}/k/v1/preview/app/form/fields.json`;

  const options = {
    method: 'put',
    headers: {
      'X-Cybozu-API-Token': APITOKEN,
      'Content-Type': 'application/json'
    },
    payload: JSON.stringify({
      app: APPID,
      properties: propertiesToUpdate
    })
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const result = JSON.parse(response.getContentText());
    Logger.log(result);
  } catch (e) {
    Logger.log(`エラーが発生しました: ${e.message}`);
  }
}

貼り付けたコードのうち、KINTONEDOMAINAPPIDAPITOKEN の値を以下のように設定します。

  • KINTONE_DOMAIN:kintoneのサブドメイン(例:example.cybozu.com

  • APPID:変更したいアプリのID(kintoneのURL内に記載されている数字)

  • APITOKEN:手順1-3でコピーしたAPIトークン

4. 実行手順

4-1. kintoneの情報を出力

現在kintoneに設定されているフィールド情報をスプレッドシートに出力するため、 exportCurrentFieldsToSheet 関数を実行してください。

4-1. kintoneの情報を出力

4-2. 変更後の値を入力

先ほど作成したスプレッドシートにkintoneの情報が出力されていることが確認できたら、C列に新しいフィールドコードの値を入力します。
※フィールド名(A列)、現在のフィールドコード(B列)、フィールドタイプ(D列)は変更できません

4-3. kintoneのフィールドコードを一括変更

GASを開き、updateFieldCodesByFieldName 関数を実行後、kintoneのアプリ設定画面を開いてください。
「反映前の変更があります」と表示されていればプログラムによる操作が正常に完了していますが、現段階では保存はされていない状態です。
※「アプリを更新」ボタンをクリックすれば一括変更の完了です。

4-3. kintoneのフィールドコードを一括変更

4-4. 試しに、再度GASで exportCurrentFieldsToSheet 関数を実行すると、以下のようにフィールドコードが変更されていることが確認できます。

さいごに

450項目を構築したアプリでは、生成AI(Claude)を利用して指定の命名規則によるフィールドコードを生成し、一括で変更を行なったため、15分程度で作業が完了しました。

スパプラでは、kintoneをベースとした「デジプラDX」というフルカスタマイズ可能なシステム開発をパッケージ展開しています。バックエンド機能をkintoneで代替し、画面デザインや同期処理はプログラムで柔軟に構築するため、フルオーダーメイドの自社システムや管理画面をリーズナブルな価格でご提供できるプランとなっています。お気軽にお問い合わせください。

サービスサイト

まずは、お気軽に相談ください

スパプラではAIを活用した業務効率化や機能開発を多数行っております。DXやシステム開発をご検討の際は、お気軽にご相談ください。

+SPOTトップ

CONTACT

お問い合わせ

まずは、無料相談から。
構想段階のアイデアやサービスについてお気軽に相談ください。