開始日~終了日までの日報フォームの作り方

複数のアプリを1つのアプリに集計させたいです。

複数アプリ(3つ)には

*団体名(文字列)

*人数(計算)

【サブテーブル】

┃開始日(日付)┃~┃終了日(日付)┃総日数(計算)┃日報区分(ドロップダウン)┃免除区分(ドロップダウン)┃金額/日数分(計算)┃金額/1日分(計算)┃

が入力されています。

 

日報フォーム(集計用アプリ)

*(日付) ←日付を入力

【サブテーブル1(アプリA)】

┃施設名(ドロップダウン)┃団体名(文字列)┃金額(1日分)(数値)┃人数(数値)┃

【サブテーブル2(アプリB)】

┃施設名(ドロップダウン)┃団体名(文字列)┃金額(1日分)(数値)┃人数(数値)┃

【サブテーブル3(アプリC)】

┃施設名(ドロップダウン)┃団体名(文字列)┃金額(1日分)(数値)┃人数(数値)┃

 

開始日から終了日までの期間、日報フォームに団体名&施設名ごとに金額(1日分)を映したいのですが可能でしょうか?

ディベロッパーツールで確認してみたところ、取得まではできているのですが

日報フォームに反映されません。

ご指摘お願い致します><;

 

(function() {
'use strict';

// 「Aアプリコピー」時の処理
kintone.events.on(["app.record.create.submit",
"app.record.edit.submit"],
function(event) {
var record = event.record;

///カーソル情報代入
var appID = 000; //データ取得元 AアプリID
var limit = 200;
var offset = 0;
var size = 100;
//日報アプリ情報代入
var reqStart = record["日付"].value;


function postCursor() {
var body = {
'app': appID,
'fields':["使用団体名","計算","Table_1"],
//'query':「フィールドコード 演算子 条件」の順序で記述
         //Aアプリ:サブテーブルtable_1「使用開始日」~「使用終了日」の間 が 日報アプリ:「日付」 and
         //Aアプリ:サブテーブルtable_1「日報区分」 が 日報アプリ:「日報区分A」 と同じ and
// Aアプリ:「使用団体名」 が 日報アプリ:「利用者A」と同じ and
//Aアプリ:サブテーブルtable_1「免除区分A」 が 日報アプリ:「減免区分A」 と同じ and
// Aアプリ:「計算」 が 日報アプリ:「人数A」と同じ and
//Aアプリ:サブテーブルtable_1「施設のみの使用料金1日」 が 日報アプリ:「基本使用料金A」 と同じ and
//Aアプリ:サブテーブルtable_1「施設の減免額計1日」 が 日報アプリ:「施設の減免額計A」 と同じ and
//Aアプリ:サブテーブルtable_1「施設_減免後_1日」 が 日報アプリ:「減免後使用料金A」 と同じ and
'query': '使用開始日 <= "'+ reqStart +'" and 使用終了日 >= "'+ reqStart +'" order by $id desc' ,
'limit': limit,
        'offset': offset,
'size': size
};

// Aアプリデータ取得用のカーソル作成(thenを使うことで resp の中にデータが格納される)
return kintone.api(kintone.api.url('/k/v1/records/cursor', true), 'POST', body).then(function(resp) {
// 成功:カーソル作成
return resp.id;
// catch で取得失敗時のエラー制御
}).catch(function(error) {
// エラー発生時にエラー表示
return error;
});
}

function getRecordsFromCursor(cursorId, opt_records) {
var records = opt_records || [];
var body = {
'id': cursorId
};

// Aアプリからデータ取得(thenを使うことで resp の中にデータが格納される)
return kintone.api(kintone.api.url('/k/v1/records/cursor', true), 'GET', body).then(function(resp) {
// 成功:データを取得
records = records.concat(resp.records);
if (resp.next) {
return getRecordsFromCursor(cursorId, records);
}
return records;
// catch で取得失敗時のエラー制御
}).catch(function(error) {
// エラー発生時にエラー表示
return error;
});

}
    //コンソールへ取得情報格納
postCursor().then(function(respCursorId) {
return getRecordsFromCursor(respCursorId);
}).then(function(respRecords) {
console.log(respRecords);

//set用レコード情報の取得
var getRec = kintone.app.record.get();

//コンソールへ格納した「アプリA」アプリフィールド情報代入
for (var i = 0; i < respRecords.length; i++) {
var resp_pCostTable = respRecords[i]["Table_1"].value;

  //日報アプリ「Aアプリ」サブテーブルへ取得データセット
  for (var ii = 0; ii < resp_pCostTable.length; ii++) {
  var strtemp = respRecords[i]["使用団体名"].value;
  getRec.record["Aアプリ"].value.unshift({
  value: {
"NOA": { "type": "NUMBER", "value": "0" },
  "日報区分A": { "type": "DROP_DOWN", "value": resp_pCostTable[ii].value["日報区分"].value },
  "減免区分A": { "type": "DROP_DOWN", "value": resp_pCostTable[ii].value["免除区分A"].value },
  "利用者A": { "type": "SINGLE_LINE_TEXT", "value": respRecords[i]["使用団体名"].value },
  "基本使用料金A": { "type": "NUMBER", "value": resp_pCostTable[ii].value["施設のみの使用料金1日"].value },
  "施設の減免額計A": { "type": "NUMBER", "value": resp_pCostTable[ii].value["施設の減免額計1日"].value },
  "減免後使用料金A": { "type": "NUMBER", "value": resp_pCostTable[ii].value["施設_減免後_1日"].value },
  "人数A": { "type": "NUMBER", "value": respRecords[i]["計算"].value },
  "備考A": { "type": "SINGLE_LINE_TEXT", "value": ""},
  }
  });
  }

}

//取得したset用レコード情報をセット
kintone.app.record.set(getRec);

}).catch(function(error) {
console.log(error);
});

return event;

});
})();

桑野美咲様

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

レコードに反映されないのは、非同期処理を待たずに「return event;」してしまっているからです。
submitイベントで、非同期処理を待ってからレコードの変更を行いたい場合は、「kintone.Promiseオブジェクト」をreturnする方法が一般的です。
https://developer.cybozu.io/hc/ja/articles/360023047852

また、レコードの絞り込みだけでなく、テーブル行の絞り込みも必要かとお思います。

コードは下記「sample.js」のようになるかと思います。
kintone-js-sdkを利用しているので、下記リンクから「kintone-js-sdk.min.js」をダウンロードして、「sample.js」の前に読み込んでください。
https://github.com/kintone/kintone-js-sdk/tree/master/dist

・sample.js

``

(function() {
  "use strict";
  kintone.events.on([
    'app.record.create.submit',
    'app.record.edit.submit',
  ], function(event){
    var date = event.record.日付.value;
    var kintoneRecord = new kintoneJSSDK.Record(new kintoneJSSDK.Connection);
    return kintoneRecord.getAllRecordsByCursor({
      app: 000,
      query: '使用開始日 <= "' + date + '" and 使用終了日 >= "' + date + '" order by $id desc',
      fields: ['使用団体名', '計算', 'Table_1']
    }).then(function(response){
      event.record.Table_1.value = [].concat.apply([], response.records.map(function(record){
        return record.Table_1.value.filter(function(row){
          return row.value.使用開始日.value <= date && row.value.使用終了日.value >= date;
        }).map(function(row){
          return {
            value: {
              利用者A: {
                value: record.使用団体名.value,
                type: 'SINGLE_LINE_TEXT'
              },
              日報区分A: {
                value: row.value.日報区分.value,
                type: 'DROP_DOWN'
              },
              金額_1日分A: {
                value: row.value.金額_1日分.value,
                type: 'NUMBER'
              },
              人数A: {
                value: record.計算.value,
                type: 'NUMBER'
              },
            }
          }
        })
      }));
      return event;
    });
  });
})();

``

江田篤史様

ご丁寧にコードまでご指導くださり、ありがとうございます。

試してみたところ8行目の

var kintoneRecord = new kintoneJSSDK.Record(new kintoneJSSDK.Connection);

の部分で怒られるのですが、何か問題があるのでしょうか?

桑野美咲様

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

「sample.js」の前に「kintone-js-sdk.min.js」を読み込んでいますか?
読み込んでいても動かない場合はエラーメッセージを教えて頂きたいです。

江田篤史様

返信が遅くなり申し訳ありません。

もしかしたらダウンロードの方法が間違っているのでしょうか?

https://github.com/kintone/kintone-js-sdk/tree/master/dist

から右上の緑ボタンのダウンロードからZipファイルダウンロードをし、解凍をしたのち、

distフォルダ内のkintone-js-sdk.min.jsを「JavaScript / CSSでカスタマイズファイル」→アップロードして追加→保存しました。

エラーが出たり出なくなったりしております。

エラーは「missing ‘( )’ invoking a constructor.」とででいますので、やはりダウンロードがきちんとできていないのでしょうか・・・

桑野美咲様

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

ESLint等を利用しているということでしょうか?

ESLintでは、コンストラクタ呼び出しの括弧は省略できないようですね。
確認不足で申し訳ございません。

下記で試していただけますか?

varkintoneRecord =newkintoneJSSDK.Record(newkintoneJSSDK.Connection());

江田篤史様

返信が遅くなり申し訳ありません><;

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

今使っているのが、キントーンプラグインの「JSEdit for kintone」です。

ご指摘いただいた個所を編集してみたところ

エラーは出なくなったのですが、やはり何も反映されません。

ディベロッパーツールで確認したところ、データ取得をした後にアクションをせずに、最後に飛んでしまう状態です。

最後にこのようなエラーが出ました。(番号のところは数字が入っていました)

Uncaught TypeError: Cannot set property ‘value’ of undefined
at download.do?app=(日報アプリID)&contentId=番号&jsType=DESKTOP&hash=番号:14

 

 

桑野美咲様

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

14行目の「event.record.Table_1.value」でエラーが出ているのかと思います.

「Table_1」をご自身の日報フォームのサブテーブル1のフィールドコードに変更してみてください.

江田篤史様

返信が大変遅くなり申し訳ありません。

ご指摘いただいた個所を修正してみましたが、やはり同じところでエラーが出ています。

念のため、日報フォームサブテーブルのフィールドコードも調べましたが、間違いありません。

最後のreturnをした後に、14行目に戻ると、変更した日報フォームのサブテーブルフィールドコードが「”Table_1”」に変わっていて、エラーがでます。

18行目からの取得も

record.はundefined

 row.value.は取得結果が出てきません。

桑野美咲様

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

「最後のreturnをした後に、14行目に戻る」というのは,「デベロッパーツールなどからコードの14行目を見る」という意味でしょうか?
状況を把握し切れていないのですが,コードの修正箇所が反映されていないということでしょうか?
その場合は,ブラウザのキャッシュ機能が関係していると考えられるので,下記などをご参照ください.
https://digitalidentity.co.jp/blog/seo/seo-tech/cash-speed-up.html

「18行目からの取得もrecord.はundefined,row.value.は取得結果が出てきません。」というのは,console.log()などで出力を行ったということでしょうか?
よろしければ,諸々試した後のコードを拝見したいです.

江田篤史様

的確なご指導感謝いたします。

キャッシュが関係していたようで、キャッシュを削除したところ、

思ったような動きが実行されました。

ここ何か月、頭を抱えておりましたので、江田様には感謝でいっぱいです。

的外れな質問等してしまったかと思いますが、ご丁寧な対応ありがとうございました。

もっと勉強したいと思います。