新規投稿
フォローする

サブテーブルに添付ファイルをアップロードするプログラムについて

お世話になります。

サブテーブルを追加する際に、追加した行が1番上になるようプログラムを組みました。

設置したボタンをクリックすることで1番上に行が挿入されるようにはなりましたが、

サブテーブル内の添付ファイルフィールドが行挿入の時に消えてしまいます。

その際にエラーは表示されません

どのようにすればサブテーブルに添付ファイルをアップロードできるのでしょうか。

アドバイス頂けますと幸いです。

    // 行追加関数
    async function addRow(record) {
        const client = new KintoneRestAPIClient();
        //サブテーブル取得
        const rectbl = record.テーブル.value;
        //テーブル全削除
        record.テーブル.value = [];
        kintone.app.record.set({ record: record });
        //現在時刻とログインユーザー名取得
        const addDate = dateToStr24HPad0(new Date());
        const addUserName = kintone.getLoginUser().name;
        //テーブルに追加
        record.テーブル.value.push({
            value: {
                "日時2": {
                    value: addDate,
                    type: 'DATETIME',
                },
                "名前": {
                    value: addUserName,
                    type: 'SINGLE_LINE_TEXT',
                },
                "リッチエディター_0": {
                    value: '',
                    type: 'RICH_TEXT',
                },
                "添付ファイル_コメント": {
                    value: '',
                    type: 'FILE'
                }
            }
        });
        kintone.app.record.set({ record: record });
        //削除したテーブルのデータを2行目以降に追加
        for (var i = 0; i < rectbl.length; i++) {
            //日付が入っていない行は飛ばす
            if (rectbl[i].value['日時2'].value !== undefined) {
                let files;
                if (rectbl[i].value['添付ファイル_コメント'].value.length > 0) {
                    files = [];
                    await dlKey2upkey(rectbl[i], '添付ファイル_コメント');
                    const filesObj = rectbl[i].value['添付ファイル_コメント'].value;
                    for (const f of filesObj) {
                        let fObj = {
                            "fileKey": f.fileKey
                        }
                        files.push(fObj);
                    };
                    //files = await dlKey2upkey(rectbl[i].value['添付ファイル_コメント'].value);
                }
                record.テーブル.value.push({
                    value: {
                        "日時2": {
                            value: rectbl[i].value['日時2'].value,
                            type: 'DATETIME',
                        },
                        "名前": {
                            value: rectbl[i].value['名前'].value,
                            type: 'SINGLE_LINE_TEXT'
                        },
                        "リッチエディター_0": {
                            value: rectbl[i].value['リッチエディター_0'].value,
                            type: 'RICH_TEXT',
                        },
                        "添付ファイル_コメント": {
                            value: files,
                            type: 'FILE'
                        }
                    }
                });
                kintone.app.record.set({ record: record });
            }
        }
    }
    const dlKey2upkey = async (rectbl, field) => {
        const files = rectbl.value[field].value;
        const client = new KintoneRestAPIClient();
        for (const f of files) {
            const blob = await client.file.downloadFile({
                fileKey: f.fileKey,
            });
            const FILE = {
                name: f.name,
                data: blob,
            };
            const ulFileKey = await client.file.uploadFile({
                file: FILE,
            });
            f.fileKey = ulFileKey.fileKey;
        };
        rectbl.value[field].value = files;
    };
0

2件のコメント

Avatar
rex0220

レコード追加・レコード編集イベントでは、添付ファイル項目の書き換えができません。

フィールドの値を書き換える 書き換えできないフィールド
・添付ファイル

添付ファイル項目の変更は、保存成功後イベントで REST API により行うしかないと思います。

ただしAPIでテーブル行を追加するとテーブル行位置と対応するルックアップやファイル項目がズレたりしますのでなかなか厄介です。
いまのところ、テーブル内にルックアップファイル項目がある場合は、イベント内のAPIでテーブル行を追加・行位置変更などは実用にならないと思います。

※行追加ボタンを JavaScript でクリックして行追加すると、ルックアップやファイル項目のズレは生じませんが、テーブル先頭には追加できませんね。

ご参考に、kintone テーブル行移動プラグインでは、追加・編集画面での処理はあきらめて、詳細画面でテーブル位置変更を行って、処理結果をREST API でレコードに反映させています。

0
Avatar
o.y

rex0220

お答えいただきましてありがとうございます。

レコード編集イベントでは添付ファイルの書き換えができないのですね。

詳細画面での実装になっても問題ないので、別の方法を検討したいと思います。

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