恐らくこんな処理で可能かと思います。紐づくレコードとありますが、レコード取得のリクエストボディにqueryがないためそのままにしています(そのまま実行するとアプリID5555のレコード100件分の添付ファイルが添付されます)。必要に応じて条件を追加して下さい。
(() => {
'use strict';
let subdomain = ''; // サブトメイン
let fileName = 'test.txt'; // ファイル名
let fileDownload = (fileKey) => {
return new Promise((resolve, reject) => {
let url = `https://${subdomain}.cybozu.com/k/v1/file.json?fileKey=${fileKey}`;
let xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.responseType = 'blob';
xhr.onload = () => {
if (xhr.status === 200) {
resolve(new Blob([xhr.response]));
} else {
reject(new Error(xhr.responseText));
}
}
xhr.send();
});
};
let fileUpload = (blob, fileName) => {
return new Promise((resolve, reject) => {
let formData = new FormData();
formData.append(' __REQUEST_TOKEN__', kintone.getRequestToken());
formData.append('file', blob, fileName);
let url = `https://${subdomain}.cybozu.com/k/v1/file.json`;
let xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onload = () => {
if (xhr.status === 200) {
resolve(JSON.parse(xhr.responseText).fileKey);
} else {
reject(new Error(xhr.responseText));
}
};
xhr.send(formData);
});
};
kintone.events.on([
'app.record.create.submit.success', 'app.record.edit.submit.success'
], async (event) => {
let record = event.record, appId = event.appId, recordId = event.recordId;
if (record['必要書類一覧'].value[0].value['必要書類一覧_添付ファイル'].value.length) return event;
let getRecordsParam = {
app: 5555,
fields: ['添付ファイル']
};
let getRecords = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', getRecordsParam);
if (!getRecords.records.length) return event;
let updateRecordParam = {
app: appId,
id: recordId,
record: {
'必要書類一覧': {
value: record['必要書類一覧'].value
}
}
};
let fileKeys = [];
for (let i = 0; i < getRecords.records.length; i++) {
let getFileKey = getRecords.records[i]['添付ファイル'].value[0]?.fileKey;
if (!getFileKey) continue;
let blob = await fileDownload(getFileKey);
let fileKey = await fileUpload(blob, fileName);
fileKeys.push({
fileKey: fileKey
});
};
updateRecordParam.record['必要書類一覧'].value[0].value['必要書類一覧_添付ファイル'].value = fileKeys;
let updateRecord = await kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', updateRecordParam);
return event;
});
})();
わからないところにお答えする前に、非同期処理やPromiseについて理解が必要です(詳細はお調べ下さい)。
>①マスタアプリからダウンロードした添付ファイル情報を抽出してアップロードする部分の記述方法(例など頂けると助かります。)
記載のコードの通りです(XMLで記述しています。openの第三引数をfalseにすれば同期リクエストになるはずですが、敢えてPromiseで記載しています)。
>②添付ファイルをアップロードする際のJSON形式での配列の書き方(for文で回して複数のレコードを取得してきている為、record[i].フィールド名.valueの部分のJSONでの書き方を知りたいです。※iは変数になります。)
前提として、サブテーブルをPUTで更新すると、リクエストボディに記載したサブテーブルの値でそのまま上書きされることになるので、仮に提示されたコードが成功した場合、添付ファイルのみのサブテーブルに書き換えられます(他のフィールドに入力したものは全て削除されます)。これを防ぐためには「既存のサブテーブルと全く同じ値をリクエストボディに含める」か「既存のサブテーブル各行に割り振られているidをリクエストボディに含める」必要があります。
その上で添付ファイルフィールドの配列内に{fileKey: ファイルキー(レコード取得APIで取得したfileKeyを使ってファイルダウンロードAPIを実行し、作成したblobでファイルアップロードAPIを実行し、返り値のfileKey)}と記載していきます。