新規投稿
フォローする

ルックアップで添付ファイルフィールドをコピー

ルックアップの標準機能では、添付ファイルフィールドをコピーすることはできません。 JavaScriptカスタマイズにて、ルックアップ時に添付ファイルフィールドをコピーする方法を紹介します。

サンプル

フォーム設定

・アプリA(ルックアップコピー元)

・アプリB(ルックアップコピー先)

「ルックアップ」フィールドの設定の「ほかのフィールドのコピー」にて、「ルックアップ元アプリのレコード番号」を「ルックアップ先アプリのルックアップID」にコピーするよう設定します。

コード

js-sdkを利用しています。 アプリBで、下記「KintoneRestAPIClient.min.js」と「sample.js」を順に読み込みます。

・KintoneRestAPIClient.min.js

https://unpkg.com/@kintone/rest-api-client@1.1.0/umd/KintoneRestAPIClient.min.js

・sample.js

(function() {
  "use strict";
  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[copyAttachmentsField].disabled = true;
    return event;
  });
  kintone.events.on([
    'app.record.create.submit.success',
    'app.record.edit.submit.success',
  ], function(event){
    if(!event.record[lookupIdField].value) return;
    var client = new KintoneRestAPIClient;
    return client.record.getRecord({
      app: kintone.app.getLookupTargetAppId(lookupField),
      id: event.record[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(copyFileInfomations){
      return client.record.updateRecord({
        app: event.appId,
        id: event.recordId,
        record: {
          [copyAttachmentsField]: {
            value: copyFileInfomations
          }
        }
      });
    });
  });
})();

※レコード編集画面でも、レコードを保存するたびに添付ファイルをコピーし直します。
※ゲストスペース内のアプリを扱う場合は、「new KintoneRestAPIClient()」の引数で「guestSpaceId」を指定する必要があります。
https://github.com/kintone/js-sdk/tree/master/packages/rest-api-client#usage

添付ファイルのコピーは、APIを4回程叩く必要があり、案外大変ですね。

2

2件のコメント

Avatar
SpLn

お世話になります。kintone初心者です。

アプリBの「ルックアップ」「ルックアップID」「添付ファイル」を全てテーブルに入れ、アプリAの「添付ファイル」をコピーできるアプリの作成を試みています。

しかしながら、下記のエラーを解決できておりません。

本記事のソースコードのどこを変更すれば実現できるようになりますでしょうか。
まったくのど素人で恐縮なのですが、ご教授いただけましたら幸いです。

1
Avatar
江田篤史

SpLn様

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

下記のようなコードになります.

(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){
    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){
      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]
                  }
                }
              }
            })
          }
        }
      });
    });
  });
})();
0
サインインしてコメントを残してください。