kintone의 "앱 내에서 다른 앱의 레코드를 검색하고 참조하고 싶습니다"라는 틈새 요구를 해결합니다.

소개



이번 어드벤트 캘린더 무엇서 이런 걸까…

우리 팀은 멀티사이즈 플랫폼 사업(MSP)에서 디지털 변환 (DX) 노력을하고 있습니다.
요컨대 의류 생산 업무의 자동화라든지 효율화군요.

이번은 사업에서 사용하고 있다.

원래 유료 플러그인 등으로 구현되어있는 기능 같지만 어떻게든 코드로 재현할 수 없을까요망을 받고 구현했습니다.

가볍게 배경



이번 구현은, 어떤 계약서의 문서를 자동 생성하기 위해서 만든 앱의 프런트 엔드 부분에 사용하고 있습니다.

문서는 레코드마다 만들어지고 있어 문서를 발행하고 싶은 레코드를 검색 조건을 기초로 검색해, 해당한 레코드로부터 발행하는 레코드만을 선택해 백엔드측에 정보를 보내는 등의 흐름입니다.

솔직히 기존의 플러그인으로 대용할 수 있을 것 같은 기능입니다만, 레코드의 내용을 참조해 ~ 처리하고 싶다고 하는 요구도 나올 것 같았기 때문에 코드로 구현하기로 했습니다.

특정 기준과 일치하는 레코드를 다른 앱에서 검색



다음과 같이 레코드의 특정 필드를 지정하고 검색 버튼을 누릅니다.
금과 소리

검색 버튼을 누른 후 검색 결과를 다음 표에 표시합니다.



이번에 만든 앱에서는 게시 필드를 선택하여 검색하여 열거된 레코드에서 필요한 레코드만 좁힐 수 있는 사양으로 되어 있습니다.

특정 단어가 포함된 레코드의 요소 검색



레코드의 필드 코트의 머리에 search_ 와 붙어 있는 물건만을 추출합니다.search_ 의 키워드를 제외하고 있는 것은, 나중에 테이블의 필드 코트의 참조에 사용하기 (위해)때문에입니다.
// アプリ内のレコード要素を取得
let record = kintone.app.record.get();

search_key_list = []
for (r_key in record.record){
  if (r_key.indexOf('search_') != -1){
    search_key_list.push(r_key.replace('search_', ''))
  }
}

다른 kintone 앱의 레코드를 참조하는 쿼리 만들기



지정된 조건으로 kintone의 레코드를 검색하기 위해 쿼리를 만듭니다.
let query_text = ''

for (const [search_key_index, search_key_value] of search_key_list.entries()){
  let search_val = record.record['search_' + search_key_value].value
  if (search_key_index == 0) {
    query_text += search_key_value + ' in ("' + search_val + '")'
  }else{
    query_text += " and " + search_key_value + ' in ("' + search_val + '")'
  }
}

다른 앱에서 레코드 찾아보기



위에서 만든 쿼리에서 kintone의 다른 앱에서 레코드를 검색하고 검색 결과를 테이블에 추가한 후 레코드를 업데이트합니다.
ID와 발행의 필드 코트는 고정이므로 별도로 처리하고 있습니다.
검색 조건이나 테이블의 항목을 편집하여 코드를 변경하지 않고 검색 조건이나 검색 후 결과를 변경할 수 있습니다.
// bodyを作成
let body = {
  "app": "appのID",
  totalCount: true
}
body["query"] = query_text

kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body).then(function(resp){
  return resp;
}, function(error) {
  console.log(error);
}).then(function(resp){
  // 取得したレコードの処理
  let records = JSON.stringify(resp);
  let results = JSON.parse(records);

  for(const [r_index, r_record] of results.records.entries()){

    // dictを新規作成
    let new_table_value = {
      id: r_index,
      value: {
        "発行": {
          type: "CHECK_BOX",
          value: []
        },
        "レコードID": {
          type: "SINGLE_LINE_TEXT",
          value: r_record["$id"].value,
          disabled: true
        },
      }
    }

    // tableのkey分ループを回す
    for(const key of key_list){
      if(key == "発行" || key == "レコードID"){
        // 事前に代入したフィールドは飛ばす
      }else{
        if(r_record[key] == undefined){
          record.record['ログ表示'].value = 'エラーが発生しました。存在しないキーをテーブルで指定しています。'
          kintone.app.record.set(record);
          return
        }
        new_table_value.value[key] = {
          type: "SINGLE_LINE_TEXT",
          value: r_record[key].value,
          disabled: true
        }
      }
    }
    table_set_records.push(new_table_value)
  }
  record.record['テーブル'].value = table_set_records
  record.record['ログ表示用に用意したフィールド'].value = '検索結果は' + results.records.length + '件です。'
  kintone.app.record.set(record);
});

사이고에게



kintone은 공식 문서가 많이 나오기도 하기 때문에 구현하기 쉬웠습니다.
다만, 앱에 업하는 코드의 관리는 어떤 느낌으로 할까...라는 고민은 있네요.

이번 생각에 실장한 곳이 있으므로, 더 좋은 방법 있어-! 라는 분이 있으시면 알려주세요 ~
(그리고 코드가 너무 정리되지 않아서 죄송합니다 ...)

그 밖에도 편리한 구현이 있으면 블로그로 해 가고 싶다고 생각합니다 ~.

좋은 웹페이지 즐겨찾기