はじめに
kintoneでユーザから組織をセットするのに手間取ったのでメモる。
余談だが、chatgptを使用せず、調査しながら行い時間がかかったが、chatgptをに聞くと瞬殺だった。chatgptを使用するのとしないのとでは明らかに生産性が違いすぎる。
行うこと
・kintoneでユーザ、組織の取得、そのセット方法を記載する。
kintoneではユーザと組織のフィールドは特定のものがある。
ユーザはユーザ選択の設定、組織は組織選択の設定である。
・kintoneはそのデータを取得するのにkintone apiを使用する仕様である。
そのとき非同期を扱うことになる。
・2つ以上の非同期を順次実行することが必要である。
その場合の例として記載する。
コード例の説明
1.ユーザ取得
fetchUserOrganization
ユーザコードより、組織情報取得するkinetone.apiを使用している。
2.組織コードを反映
copyToAnotherApp
kintone.apiのPUTを使用し、マニュアルに従い登録している。
3.ユーザ取得して組織コードを反映
箇所抜粋
async function handleProceedEvent(event) {
//ユーザの組織情報取得
const organizationName = await fetchUserOrganization(user.code);
if (organizationName) {
//組織コードを反映
await copyToAnotherApp(organizationName);
}
}
上記は以下を行う。
3.1 非同期で1,2を行う。
3.2 3.1の非同期を行うために、asyncで処理関数を処理する。
(その他)
・プロセス管理によるアクションで実行を行う
event.action.name にて処理を振り分ける。
・データ取得、登録
kintone.api()を使用
取得箇所例
const response = await kintone.api(kintone.api.url('/v1/user/organizations', true), 'GET', { code: userCode });
登録箇所例
const response = await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', body);
・プロセス管理のアクション時動作
eventのrecord、actionの使いどころがある。
kintone.events.on('app.record.process.proceed', function(event) {
if (event.action.value === "承認") {
// "承認" アクションがクリックされた際の処理をここに記述
}
return event;
});
コード例
(function() {
'use strict';
// ユーザの組織情報を取得
async function fetchUserOrganization(userCode) {
const response = await kintone.api(kintone.api.url('/v1/user/organizations', true), 'GET', { code: userCode });
return response.organizationTitles[0] && response.organizationTitles.length > 0 ? response.organizationTitles[0].organaization.name : null;
}
// 組織情報を別のアプリにコピー
async function copyToAnotherApp(organizationName) {
const body = {
"app": コピー先のアプリID,
"record": {
"組織フィールド名": {
"value": organizationName
}
}
};
const response = await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', body);
return response;
}
async function handleProceedEvent(event) {
if (event.action.name !== "コピー") {
return event;
}
const record = event.record;
const user = record['ユーザ選択フィールド名'].value[0];
if (!user) {
return event;
}
try {
const organizationName = await fetchUserOrganization(user.code);
if (organizationName) {
await copyToAnotherApp(organizationName);
}
} catch (error) {
console.error("エラー:", error);
}
return event;
}
//レコード詳細画面が表示されたときに発火
kintone.events.on('app.record.detail.show', handleProceedEvent);
kintone.events.on('app.record.process.proceed', function(event) {
if (event.action.value === "承認") {
// "承認" アクションがクリックされた際の処理をここに記述
}
return event;
});
})();