添付ファイル操作について教えて頂きたいです。

恐らくこんな処理で可能かと思います。紐づくレコードとありますが、レコード取得のリクエストボディに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)}と記載していきます。