新規投稿
フォローする

フォームブリッジの値を複数のkViewerルックアップに反映させたい

お世話になっております。

kViewerルックアップについてjsでカスタマイズしたいと思っています。

内容としては

1、kViewerルックアップAでkintoneアプリAから検索し選択する
kViewerフィールドからフォームブリッジフィールドの文字列(1行)に値Aを自動的に反映する
--ここまでは既存の設定で出来ました

2、kViewerルックアップAを選択したタイミングでkViewerルックアップBにも、値Aが自動で挿入される

3、kViewerルックアップBでkintoneアプリBから自動で検索し選択する
※検索結果が複数ある場合や空の場合、処理をスキップして空のままにしたい

4、kViewerルックアップC以降も同様に、値Aに紐づく値を反映する


フォームブリッジのkViewerルックアップで、1つのデータしか参照できないため、
複数のkintoneアプリから参照しようと思うと同じ参照値を何度も記入してボタンを押す必要があるため、
この手間をなくしたいと思っています。

jsのカスタマイズ等で何かいい方法がありましたらご教示ください。
よろしくお願いいたします。

0

2件のコメント

Avatar
友利優希

お世話になっています。

cstapの友利と申します。

以下のJavaScriptのコードを読み込むことで可能です。

(function() {

"use strict";

const look_up_A = 'ルックアップAのフィールドコード';
    //もしルックアップC以降も追加したい場合はこの配列にフィールドコードを追加してください
const auto_look_up = ['ルックアップBのフィールドコード', 'ルックアップCのフィールドコード'];
const text_line = '文字列のフィールドコード';

const api = 'https://viewer.kintoneapp.com/public/api/records/';

let run_kviewer_lookup = false;

fb.events.fields[text_line].changed.push(function (state) {
if (!run_kviewer_lookup) return;
run_kviewer_lookup = false;

auto_look_up.map(d=> {
state = setAutoKviewer(state, d);
})

return state;
})

fb.events.kviewer.records.fetch.push(function (state, param) {
if (param.field !== look_up_A) return;
run_kviewer_lookup = true;

return state;
})

const setAutoKviewer = (state, code) => {
cons tvalue = state.record[text_line].value;

state.record[code].value = value;

const field = state.fields.find(d => d.code === code);

const filters = createAdditionalFilters(field, value);

const url = generateUrl(api + field.lookup.view.viewCode + '/1', {
additionalFilters: filters
})

const xhr = newXMLHttpRequest()
xhr.open('GET', url, true);
xhr.onload= () => {
if (xhr.readyState !== xhr.DONE) return;
if (xhr.status !== 200) return;
const res = JSON.parse(xhr.response);
if (res.totalCount > 1 || res.totalCount === 0) return;
field.lookup.fieldMappings.map((v, i) => {
state.record[v.field].value = res.records[0][v.relatedField].value;
})
}
xhr.send(null);

return state;
}

const createAdditionalFilters = (field, value) => {
if (value === '') return [];
const filters = [];
const addFilter = code => {
const serch_field = field.lookup.view.kintoneApp.fields.find(d => d.code === code);
if (['SINGLE_LINE_TEXT', 'LINK'].indexOf(serch_field.type) !== -1) {
filters.push({
with: 'or',
field: code,
sign: field.lookup.isPerfectMatch ? '=' : 'like',
value: value
})
} else if (!isNaN(value) && ['NUMBER', 'CALC', 'RECORD_NUMBER'].indexOf(serch_field.type) !== -1) {
filters.push({
with: 'or',
field: code,
sign: '=',
value: value
})
}
}
if (field.lookup.searchField) {
addFilter(field.lookup.searchField);
} else {
field.lookup.labelFields.forEach(code=> {
addFilter(code);
})
}
return filters;
}

const generateUrl = (baseUrl, params= {}) => {
let queryParams = [];

if (params !== [] && params !== {}) {
const add = (key, value) => {
// if value is a function then call it and assign it's return value as value
value = (typeof value === 'function') ? value() : value

// change null to empty string
value = (value === null) ? '' : value

queryParams.push(encodeURIComponent(key) + '=' + encodeURIComponent(value))
}

const buildQueryParams = (prefix, params, add) => {
const rbracket = new RegExp(/\[\]$/)
if (params instanceof Array) {
params.forEach((val, i) => {
if (rbracket.test(prefix)) {
add(prefix, val)
} else {
buildQueryParams(prefix + '[' + (typeofval === 'object' ? i : '' ) + ']', val, add)
}
})
} else if (typeof params === 'object') {
for (let name in params) {
buildQueryParams(prefix + '[' + name + ']', params[name], add)
}
} else {
add(prefix, params)
}
}

for (let prefix in params) {
buildQueryParams(prefix, params[prefix], add)
}

return baseUrl + '?' + queryParams.join('&').replace(/%20/g, '+')

} else {

return baseUrl
}
}

})();
0
Avatar
s-sakai

友利様

お世話になっております。
s-sakaiです。

期待した通りの動きをしました。
ご回答ありがとうございました。

今後ともよろしくお願いいたします。

0
ログインしてコメントを残してください。