見出し画像

Kintoneアプリで文字列操作

Kintoneアプリカスタマイズの要望です。
今回は、12桁の商品コードを入力したら、前3桁の文字を別のフィールドに自動設定して検索対象にしたい(2度入力したくない)という要望です。
「123456789001」の様なコードの前3桁に分類の意味が有るそうです。
Kintoneの標準機能では、半角英数字はスペースや/で区切られたワード単位でしか検索できません。
上記のコードを「123」だけで検索するとNotFoundになります。

実は、入力方法を「123-456789-001」の様に検索したい桁単位でハイフンや空白で区切って入力すれば、区切り記号単位のワードで検索できるので、その方法を提案したのですが「入力方法を変えるのはダメ」と言われたので、商品コードから前3桁を切り出して別フィールドにコピーするという方法を考えました。

Kintoneアプリでは、文字列(1行)フィールドで計算式を用いることができますが、計算式で利用できる関数の種類は限られています。
参照:Kintoneヘルプ「関数の説明」
エクセルならば、文字列操作関数(LEFT関数等)で簡単に実現できますが、Kintoneの標準機能には、文字列操作関数がありません。

無ければ作るしかないので、JavaScriptでエクセルの「Mid関数」の様な動きを実現するカスタムコードを作成してみました(Left関数よりMid関数の方が汎用性が高いと思ったためです)。

文字列を切り出して別フィールドにコピー

上記のデモ画面では、Kintoneのレコード追加、編集イベントで、入力文字列が変更された時にカスタム関数が動作する様に設定しています。

文字列取り出しのJavaScriptコード

/* 疑似MID関数で文字列の切り出し */
(() => {

	'use strict';

      // 初期設定
      const SOURCE_FIELD = '入力文字列';	// 処理対象の文字列1行のフィールドコード
      const OUTPUT_FIELD = '出力文字列';	// 値を渡す別フィールドのフィールドコード
      const START_INDEX = 2;            // 取り出し開始列(0始まり)
      const WORD_COUNT  = 4;            // 取り出す文字数

	// レコードの追加、編集イベントで動作させる
  	const events = [
    		'app.record.create.change.'+ SOURCE_FIELD,
		'app.record.edit.change.'+ SOURCE_FIELD
		];

  	kintone.events.on(events, (event) => {

		const record = event.record;	// 現在のレコードを取得

		//SOURCE_FIELDの指定の文字列を取り出し
		let Output_String;
		Output_String = record[SOURCE_FIELD].value.substring(START_INDEX, START_INDEX + WORD_COUNT);

		//OUTPUT_FIELDに切り出した文字列をセットする
		record[OUTPUT_FIELD].value = Output_String;

		return event;
	});

})()

汎用性を持たせるために初期設定で、入力フィールド、出力フィールド、取り出し開始列、取り出す文字数を設定できる様にしています。
取り出しの開始列を0にするとLEFT関数の様に動きます。

動作確認してリリースしてみたら、2重入力せずにコードの分割登録が出来る様になりました。
情報システムで用いるコードの取り扱いは、検索や集計で扱いやすい様に、コードの意味(区分)毎に入力欄を分割するか、区切り記号('ー'や'/'など)で分割するセパレート記号を挿入する処理があればi良いと思います。

文字列にセパレート記号を挿入する方法については、以下の記事も参考にしてください。

よろしければサポートお願いします! いただいたサポートは、note記事制作の活動費に使わせていただきます!