新規投稿
フォローする

テーブル内にルックアップで添付ファイルのコピーをしたい

失礼いたします。

コミュニティにて投稿されて居た、「ルックアップで添付ファイルフィールドをコピー」と言うものとその内容に寄せられたコメントを元に、テーブル内にルックアップの添付ファイルをコピーしたいと思い導入させて頂こうとした者です。

使用しているフィールド、フィールド名はそのままで、テーブル内に入れなければ導入が成功しているのですが、テーブル内に入れる為のコードを使用し、テーブル内に入れた際に、以下三点の様な状況になってしまいます。

Javascriptに不慣れな為、コードの何処をどのように修正すれば良いのかわかりません。

宜しければお詳しい方から見ての、アドバイスやご指摘などをいただければ幸いです。

0

36件のコメント

Avatar
koichi

nagashimaさん

こんにちは。

 

江田さんが投稿された初回のコードではなく、その後にテーブル用に投稿されたコードを使用されていますか?

テーブル用コード

 

また、テーブルが画像のような構成になっていますでしょうか。

 

1
Avatar
nagashima

koichi様こんにちは、お世話になっております。

はい、その通りです。初回のコードではなく、その後にテーブル用に投稿されたコードを使用させていただいています。

テーブルの画像につきましては、その画像そのままの構成です。相違ありません。

0
Avatar
koichi

ご確認ありがとうございます。

エラー画像(コンソール画面)の「download.do?app=43~~~」をクリックしてください。

エラーになったコード箇所が表示されるはずです。

undefined (reading value)ですので、フィールドコードが存在しないなど、value値が取れないエラーと思われます。

0
Avatar
nagashima

ありがとうございます、ご指摘の通りにクリックした所、

  return kintone.Promise.all(originRecord.record[originAttachmentsField].value.map(function(originFileInfomation){

(コード内30行目)

の部分がハイライトされました。この部分がエラー部分だと思われるのですが、どうでしょうか?

0
Avatar
koichi

「originAttachmentsField」を冒頭で定義していると思うのですが

その値とコピー元アプリの添付ファイルフィールドのフィールドコードは一致していますか?

0
Avatar
nagashima

一致していませんでした、修正致しました。

その上でもう一度試みてみたところ、次はこういったエラーコードが出ます。

0
Avatar
koichi

デベロッパーツールのNetworkタブを開いてください。

以下画像のように、「update.json」から始まるものがあるはずです。

エラーのため恐らく赤文字になっていると思います。

それをクリックし、「Response」タブを開くと横長の文字列と思いますが、途中にエラーの原因が記載されているはずです。

 

koichiにより編集されました
0
Avatar
nagashima

此方でしょうか?

0
Avatar
koichi

そちらです。

「編集中に、ほかのユーザーがレコードを更新しました」とありますので

自レコードの保存成功後に、同時に複数の更新処理が重なっているものと思われます。

 

この添付ファイルの処理とは別に、自レコードに対してPUTする処理が入っていないでしょうか?

自作のJavaScriptでなくて、プラグインでの処理の可能性もあります。

0
Avatar
nagashima

なるほど・・・!

自作のJavaScriptはこの江田様とそのコメント欄で行われた際のコードしか入れておりませんので、恐らくプラグインかと思われます。

「JSEdit for kintone」「kintone ルックアップ動的絞り込みプラグイン」「タブ表示試用版」の3つが入って居るのですが、この中だと2つ目の絞り込みプラグインでしょうか?

0
Avatar
koichi

それらのプラグインは関係ない気がします。

先ほどのNetworkの「update.json」よりも上に、同じく「update.json」や「record.json」から始まるものはありますか?

あれば、それが先に実行されているPUT処理です。

koichiにより編集されました
0
Avatar
nagashima

「update.json」と「record.json」が先にありました。

0
Avatar
koichi

同じ処理が2回走っているように思います。

コード内に「client.record.updateRecord」の記述が2回以上登場したり

アプリ設定のJavaScript / CSSでカスタマイズに類似したソースコードが2個以上参照されていたりしないでしょうか。

0
Avatar
nagashima

コード内に「client.record.updateRecord」の記述は一度だけでした。

また、アプリ設定のJavaScript / CSSのカスタマイズには江田様の所で導入した物しか入っておりません。

0
Avatar
koichi

こちらでも動作を確認したいので、お手数ですがnagashimaさんのコードを載せていただくことは可能ですか?

江田さんのコードをもとにされているとは存じますが、その後のやり取りまで反映された部分もあるかもしれませんので、お願いいたします。

0
Avatar
nagashima

寧ろこんなにも親身にお話し頂いてありがとうございます。大変助かっております・・・!

こうなっております。

nagashimaにより編集されました
0
Avatar
koichi

ありがとうございます。違いが見当たらないですね。。

47行目からのコードを以下に変えていただけますか?

 

保存後にコンソールに画像のようなログが出るか、確認をお願いします。

※新規登録ではなく、既に登録したものを編集保存でお願いします。

 

また、最初の画像でテーブルが3つあるかと思いますが

他2つのテーブルについては、コード上は何も処理をしないものでしょうか。

 

})).then(function(copyFileInfomationsChunks) {
  console.log('start'); // ★
    return client.record.updateRecord({
        app: event.appId,
        id: event.recordId,
        record: {
            [table]: {
                value: event.record[table].value.map(function(row, index) {
                    return {
                        value: {
                            ...row.value,
                            [copyAttachmentsField]: {
                                value: copyFileInfomationsChunks[index]
                            }
                        }
                    }
                })
            }
        }
    }).then(function() {
        console.log('end'); // ★
    });
});

 

koichiにより編集されました
0
Avatar
nagashima

画像の方のログの方は出ませんでした。

他2つのテーブルに関しては何も処理をする予定がありません。

0
Avatar
koichi

追加で2点確認をお願いします。

 

①全てのプラグインを無効状態にして動作確認お願いします。

 

②23行目付近を以下に変更して、再度コンソールのログを確認してください。

 ※先ほどと同様に新規登録ではなく、既存のレコードの編集保存でお願いします。

kintone.events.on([
        'app.record.create.submit.success',
        'app.record.edit.submit.success',
    ], function(event) {
        console.log(event);
        var client = new KintoneRestAPIClient();

 

③お使いのブラウザはChromeですか?

あまり考えにくいですが、ブラウザによって挙動が変わるかもしれませんので、別のブラウザがありましたら、そちらでも動作を試してみてください。

koichiにより編集されました
0
Avatar
nagashima

ご返信遅れまして申し訳ございません。

①、②を行った状態で動作確認をした所、エラーメッセージは発生しませんでしたが、添付ファイルにコピーされるべきオリジナルのデータが表示されませんでした。

また、③に関しましては使用して居るブラウザはChromeです。

0
Avatar
koichi

ご確認ありがとうございます。

 

②を反映した状態でコンソールのログのキャプチャを頂けますか?

以下画像のようなログが出るはずです。

 

また、以前の投稿で「Network」にupdate.jsonが二回登場するということでご回答いただいていました。

それぞれをクリックした際の「Payload」の中身のキャプチャもお願いします。

 

※赤枠以外はマスキングしていただいて問題ありません。

koichiにより編集されました
0
Avatar
nagashima

これがありました。

また、update.jsonが2つあった件ですが、今は見当たりませんでした。

1つあった方の中身はこの様になっていました。

0
Avatar
koichi

ありがとうございます。

白文字の「download.do?~~~」をクリックすると、エラーになったコード箇所が表示されます。

 

恐らく、コード全体の最後の括弧が足りない(あるいは多い)可能性があります。

括弧の有無をご確認ください。

koichiにより編集されました
0
Avatar
nagashima

この部分かと思われます。

0
Avatar
koichi

閉じ括弧が無いのかもしれないです。

私が確認したコード全文を貼ります。

(function() {
    "use strict";
    var table = 'テーブル';
    var lookupField = 'ルックアップ';
    var lookupIdField = 'ルックアップID';
    var originAttachmentsField = '添付ファイル';
    var copyAttachmentsField = '添付ファイル';
    kintone.events.on([
        'app.record.detail.show',
        'app.record.create.show',
        'app.record.edit.show',
    ], function(event) {
        kintone.app.record.setFieldShown(lookupIdField, false);
        event.record[table].value.forEach(function(row) {
            row.value[copyAttachmentsField].disabled = true;
        });
        return event;
    });
    kintone.events.on([
        'app.record.create.submit.success',
        'app.record.edit.submit.success',
    ], function(event) {
        console.log(event);
        var client = new KintoneRestAPIClient();
        return kintone.Promise.all(event.record[table].value.map(function(row) {
            if (!row.value[lookupIdField].value) return [];
            return client.record.getRecord({
                app: kintone.app.getLookupTargetAppId(lookupField),
                id: row.value[lookupIdField].value
            }).then(function(originRecord) {
                return kintone.Promise.all(originRecord.record[originAttachmentsField].value.map(function(originFileInfomation) {
                    return client.file.downloadFile({
                        fileKey: originFileInfomation.fileKey
                    }).then(function(fileData) {
                        return {
                            file: {
                                name: originFileInfomation.name,
                                data: new Blob([fileData], { type: originFileInfomation.contentType })
                            }
                        };
                    });
                }));
            }).then(function(files) {
                return kintone.Promise.all(files.map(function(files) {
                    return client.file.uploadFile(files);
                }));
            });
        })).then(function(copyFileInfomationsChunks) {
            console.log('start');
            return client.record.updateRecord({
                app: event.appId,
                id: event.recordId,
                record: {
                    [table]: {
                        value: event.record[table].value.map(function(row, index) {
                            return {
                                value: {
                                    ...row.value,
                                    [copyAttachmentsField]: {
                                        value: copyFileInfomationsChunks[index]
                                    }
                                }
                            }
                        })
                    }
                }
            }).then(function() {
                console.log('end');
            });
        });
    });
})();
0
Avatar
nagashima

全文のコードをお借りさせて頂いた上で仮運用してみました。


 

 

0
Avatar
koichi

ルックアップのコピー元にレコード番号が指定されてますでしょうか?

0
Avatar
nagashima

行えて居ます

0
Avatar
koichi

レコード番号であれば重複しない値なので、そのエラーが出ないはずなのですが不思議な現象ですね。

デベロッパーツールでブレークポイントを打って、上から順に実行した際にどこで止まるかご確認ください。

ブレークポイントを設定する

 

0
Avatar
koichi

再三の確認で申し訳ありませんが

先ほどのルックアップの設定画像は、テーブル内に設置したルックアップでお間違いないでしょうか。

 

加えて、コード冒頭の変数値がテーブル内のフィールドコードと一致しているか、今一度ご確認お願いします。

var table = 'テーブル';
var lookupField = 'ルックアップ'; // ★テーブル内
var lookupIdField = 'ルックアップID';   // ★テーブル内
var originAttachmentsField = '添付ファイル'; // コピー元アプリのフィールド
var copyAttachmentsField = '添付ファイル';   // ★テーブル内
koichiにより編集されました
0
サインインしてコメントを残してください。