カレンダーPlus 右クリックで複製したときルックアップを自動取得したい

無償版で試用させていただいており、社内でも好評で、

社員だけでなく協力会社のスケジュールも入力させようということになりました。

協力会社の担当者名はルックアップフィールドで作成しております。

入力した人から、右クリックの複製からだと担当者名が消えて再度入力するのが面倒というという合わせがあったため、自動ルックアップさせようと以下コードを書きました。

(function() {
  'use strict';
// 一覧画面表示時
kintone.events.on(['app.record.index.show'], function(event) {
     // カレンダーPlus:複製
    calendarplus.events.on(['cp.event.duplicate.submit'], function(e) {
    
  let rec = e.record;

rec['外部人員名'].lookup = true;
  
  return e;
 });

    return event;
  });
})();

が、どうやらCalendarPlusJavaScriptAPIリファレンスを確認すると、

通常のルックアップフィールドの値は持っておらず、空白のためルックアップできないようでした・・・

通常のkintone詳細画面からの複製では値を持ってきていたため、同じように動かして、

ルックアップ自動取得を実現したいと考えています。

何か良い方法がございましたら教えていただければと思います。

よろしくお願いいたします。

森川さん

カレンダーPlus開発元のラジカルブリッジ斎藤と申します。

この度はカレンダーPlusをご検討いただきましてありがとうございます。

まず、右クリックによる複製には以下の制限事項がございます。

  • 予定の右クリックによる「複製」では以下のフィールドは複製されません。
  1. kintone REST APIで登録できないフィールドタイプ
    レコード番号、レコードID、リビジョン、作成者、作成日時、更新者、更新日時、カテゴリー、ステータス、作業者
  2. 添付ファイルフィールド
  3. リソースとして設定されていないルックアップフィールド
  4. 添付ファイルフィールドやルックアップフィールドが含まれるサブテーブル

上記3.にひっかかっているために、現状ルックアップフィールドがコピーされない状態になっているかと思います。まずはカスタマイズの前に、該当ルックアップフィールドを「リソースとして利用するフィールド」に指定できるかどうかご確認ください。尚、「リソースとして利用するフィールド」に指定したルックアップフィールドは、ルックアップのコピー元が重複禁止になっている必要がございますので、併せてご確認ください。

「リソースとして利用するフィールド」に指定できない、あるいはしたくない場合は、今回のようなカスタマイズを検討することになりますが、Calendar Plus JavaScript APIリファレンスのp.23「コンテキストメニューからのイベントレコード複製前イベント」にも記載しておりますように、このタイミングでは上記4つに該当するフィールドは record から除外されています。一方、record-original も取得でき、こちらには元々のレコードの内容が全て残っていますので、こちらからルックアプフィールドの値を取得することが可能です。

▼ Calendar Plus JavaScript APIリファレンス
https://radical-bridge.com/product/kintone-plugin/calendarPlus/CalendarPlus-JavaScript-API.pdf

※record-original.value という記述方法ではJSエラーになると思いますので、[‘record-original’].value のような形で取得してみてください。

尚、カスタマイズを行う場合でも、ルックアップのコピー元が重複禁止である必要がある点は変わりませんのでご注意ください。

 

斎藤 栄さま

コメントありがとうございます!お返事遅くなり申し訳ございません。

教えていただいたrecord-originalでvalue取得はできたんですが、複製したレコードのルックアップフィールドに代入して、.lookup = trueが上手く行かず試行錯誤中です・・・

(function() {
  'use strict';
// 一覧画面表示時
kintone.events.on(['app.record.index.show'], function(event) {
     // カレンダーPlus:複製
    calendarplus.events.on(['cp.event.duplicate.submit'], function(e) {
    
let rec = e.record;//複製したレコード  
  let recOri = e["record-original"];//元のレコードを取得
  
  rec['外部人員名'].value = recOri['外部人員名'].value;//元のレコードから複製したレコードに代入
//ここでChomeディベロッパーツールでエラーが出て試行錯誤中・・・

  rec['外部人員名'].lookup = true;//自動ルックアップ
  
  return e;
 });

    return event;
  });
})();

取り急ぎ、元レコードは取得できましたので引き続き調べながらやってみます。

ありがとうございました!

森川さん

.lookup = true; は、kintoneの追加・編集画面でルックアップの自動取得を行いたい場合にセットするもので、
Calendar Plus JavaScript APIでは、最終的にはkintone REST APIで複製したレコードを登録する流れになりますので、
.lookup = true; の記述は不要となります。
(ルックアップフィールドの参照元フィールドが重複禁止になっていれば、自動的にルックアップ参照されます)

いかがでしょうか?

斎藤さま

エラーはlookupする前の、代入する部分で起きてます・・・書き方が悪くすみません。

Chromeディベロッパーツールでは↓のエラーメッセージが表示され、後半の「= recOri[‘外部人員名’].value;」部分に波線が表示されます。

>Uncaught (in promise) TypeError: Cannot set properties of undefined (setting ‘value’)

色々考えたりキーワードでググってみたりしてますが、なかなか解決にたどり着けません・・・

斎藤さま

自己解決しました!かなり力技感がありますが・・・

代入するのを.valueに限定せず、そのままフィールド全部代入すると、

ルックアップ取得済みのレコードが複製されました!

(function() {
  'use strict';
// 一覧画面表示時
kintone.events.on(['app.record.index.show'], function(event) {
     // カレンダーPlus:複製
    calendarplus.events.on(['cp.event.duplicate.submit'], function(e) {
    
  let rec = e.record;
  rec['出勤'].value = [];
  rec['退勤'].value = [];
  rec['メモ'].value = "";
  
  let recOri = e["record-original"];//元のレコードを取得
  
  //.valueではなく丸ごと代入
  rec['外部人員名'] = recOri['外部人員名']; //元のレコードから複製したレコードに代入

  return e;
 });

    return event;
  });
})();

record-originalのおかげで実現できました、ありがとうございました!

>>Chromeディベロッパーツールでは↓のエラーメッセージが表示され、後半の「= recOri[‘外部人員名’].value;」部分に波線が表示されます。
>>Uncaught (in promise) TypeError: Cannot set properties of undefined (setting ‘value’)

失礼しました。
recには 外部人員名 というプロパティが無い(カレンダーPlusが削除したため)ので、存在しない rec[‘外部人員名’] の.value を参照しようとしてエラーになっています。

rec[‘外部人員名’] = {
    ‘value’: recOri[‘外部人員名’].value
};

とすると良いでしょう。

 

斎藤さま

こちらも情報の後出しでお手間かけさせてしまい、失礼いたしました。

私の勉強不足で書き方が分からず力技に走りましたが、頂いたコードに変更して動作確認できました。

無事やりたいことも実現でき、勉強にもなり、大変助かりました。

ありがとうございました。