一覧画面で他アプリから更新日を取得、更新日に応じてステータスを表示

アプリA

特定のユーザーを対象とした、ユーザーコード(重複無し)を含むデータ

アプリB

全ユーザー対象。ユーザー訪問日ごとのデータ(=同一ユーザーで複数の訪問日)

ユーザーコード含む。

実現したい事:

一覧表示画面で、アプリAの一覧画面でアプリAに存在するユーザー別の最新の訪問日をアプリBから取得、訪問日が過去1ヶ月以内ならば”UPDATE"を表示。

困っていること:

kintone.app.edit.submit, create submit 画面では、以下コードで実現できましたが、一覧画面からユーザーごとの最新の訪問日を取得するためにはどうように記述すべきか分からなく止まっています。以下コードの一部を変更することで実現可能でしょうか?可能であればどのように変更すべきかご教授頂きたくお願い致します。

(function() {
  ‘use strict’;
 kintone.events.on([‘app.record.edit.show’,‘app.record.edit.show’], function(event) {
 let query =  ‘アプリBユーザーコード = "’ + event.record[‘アプリAユーザーコード’].value + ‘"’;
      let params = {
      ‘app’: 8,//アプリB ID
      ‘fields’:[‘houmonbi’], 
      ‘query’ : query
    };
   kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params,function(resp) {
        // success
      console.log(resp.records[0]);
      let resp1 = resp.records[0][‘houmonbi’].value; 
      console.log(resp1); 

      let record = kintone.app.record.get();
      record.record[‘houmonDate’].value = resp1;
      kintone.app.record.set(record);
    
      let resp1Date = Date.parse(resp1);
      console.log(resp1Date);
      let now = new Date();
      let date1month = now.setMonth(now.getMonth() -1);
      console.log(date1month);
       
        if(resp1Date >= date1month){
        record.record[‘UpDateStatus’].value = “UP!”;
        kintone.app.record.set(record);
         } 
         else {
        record.record[‘UpDateStatus’].value = “”;
        kintone.app.record.set(record);
         }    
    },function(error) {
        // error
        console.log(error);
    });
        return event;
  });
})();

 

レコードの取得(GET) – cybozu developer network
https://developer.cybozu.io/hc/ja/articles/202331474-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%8F%96%E5%BE%97-GET-#step1

を参考に

order by 訪問日 desc limit 1

にするのはどうでしょうか?

条件を満たしたレコードにUpDateStatusの項目にUP!と入力したいという要件は満たしませんが、どのユーザーに訪問できているか?を知りたいのであれば、標準機能のクロス集計でもリストは作れるとおもいます。ご参考まで。

 

harada 様

ご回答ありがとうございます。

1)ご提案頂いたorder by を利用する方法を試してみましたが、アプリBの最新訪問日を1件取得となってしまいました。

ユーザーが複数の訪問日を持つアプリBの、ユーザーごとの最新の日付を取得したいのですが、クエリで取得することは可能でしょうか?対象となるユーザーはアプリA登録ユーザーです。

取得したデータをユーザー名でグループ化、そこから最新の訪問日を取得すれば出来るのかなと考え、調べたところreduceを用いてグループ化できるようなのですが、当方には理解が及びませんでした。以下今試したコードです。

(function() {
  ‘use strict’;
  kintone.events.on(‘app.record.index.show’, function(event) {
        
      let query =‘userCode = “50000” or userCode = “50500” or userCode = “51000”’;
      // アプリAに存在するユーザーコードを上のような1件づつの指定ではなく、event.record…のようなフィールドコードで指定したいです。どのように記述するべきでしょうか?

      let params = {
      ‘app’: 8,//アプリB ID
      ‘fields’:[‘houmonbi’,‘userName’], 
      ‘query’ : query
      };
    
   kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params,function(resp) {

      const userNameGrp = [resp.recrods];

      const groupBy = function(xs, key) {
        return xs.reduce(function(rv, x) {
          (rv[x[key]] = rv[x[key]] || []).push(x);
            return rv;
        }, {});
      };

      const ReportGroupByUser = groupBy(userNameGrp, ‘userName’);

      console.log (ReportGroupByUser);

     // ネットから引用させて頂き試しましたが、書き方が正しくないのかグループ化されませんでした。
上のプログラムを実行し、コンソールで確認すると、
undefined : Array(1)
         0 : Array(53)
           0: houmonbi,userName
        1: houmonbi,userName    
          53: houmonbi,userName })

となってしまいました。これにつきましてもアドバイス頂けますと幸甚です。

  });
})();

2)詳細画面を開いて一件ずつ、編集~保存をすれば以前の方法で更新できるのですが、データが多くなった際は効率が悪いのでアプリA一覧を開いたときに、当月更新が分かるようになればと思った次第です。

以上、よろしくお願い致します。

こちらが参考になると思います。

https://developer.cybozu.io/hc/ja/community/posts/900001057226-kintone%E3%81%AE%E4%B8%80%E8%A6%A7%E3%81%AB-%E8%A8%88%E7%AE%97%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E4%B8%80%E6%8B%AC%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E8%A8%AD%E7%BD%AE%E3%81%97%E3%81%9F%E3%81%84%E3%81%A7%E3%81%99-?page=1#community_comment_900000369606

この例では、訪問日の最大値を取得する部分がありません。

アプリAがユーザーマスターですから、アプリBのデータをgroupbyする必要はないとおもいます。

上に挙げた例は再計算が必要だから、レコードをすべて取得して空の更新が致し方ない部分があります。

今回のご質問の例ではそこまでして入れる必要があるの?標準の一覧機能でユーザーIDごとに最終日付がとれるならば用は足りるのではないかと考えました。「標準機能のクロス集計で事足りないでしょうか?済ますことはできないでしょうか?」

参考サイトをサンプルアプリで試してみました。

選択されたあたりでデータがとれるのでユーザーIDでアプリBにクエリーをかけて訪問日の最大を取得して空で書き込んでいる部分に条件をみて、UpDateStatusを上書きする流れになると思います。

harada 様

ご回答ありがとうございます。

クロス集計機能は初見でした。勉強になります。

実現したいことはクロス集計機能で実現できそうです。

ご提示いただいたサンプルコードは理解がまだまだ必要ですが、分かるようになったら、javascript での表示に挑戦したいと思います。この度はご検討、アドバイス、ありがとうございました。

また機会がございましたらよろしくお願い致します。