日付を条件に計算フィールドの値をテーブルにコピーしたい

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

 

現在、小口現金の申請用アプリを作成しているのですが、毎月の小口残高を月が変わったときに自動で繰り越せるようにしたいと思っております。

具体的には

〆日(日付フィールド)が2022/09/30に設定されているレコード(以下 9月分)と〆日が2022/10/31に設定されているレコード(以下 10月分)があります。

現在の日付が10月1日になったタイミングで9月分にある残高(計算フィールド)の値を10月分のテーブル(申請フォーマット)1行目の支払時点残高にコピーしたいと思っております。

 

とても中途半端なところでコードが止まってしまい(1行目の取得がわからず)コードがぐちゃぐちゃな状態ではありますがご教授して頂けますと幸いです。

使用コード

(function() {
  'use strict';
     //現在日時を取得
    var now = new Date();
    var nowDate = now.getTime();

if(records( 〆日.value )< now.getTime ){
    subtable.push({
      value: {
        "残高": { value: tableRecords[i].value['10月分テーブルの一行目'].value },
     
  }
 });
    return event;
  };
})();

レコード画像

 

nekoko

あるレコードの1行目は、

record.テーブルのフィールドコード.value[0].value

で取得できます([0]が1番め、という意味)。
ただ、要求する内容をみるに、
具体的にどのタイミング(アプリを開いた時?)でやるのか、
アプリの構造(◯月分がいっぱいあるのか、重複があるのか、など)がどうなっているか、
などによってやり方が変わってくると思います。

TO様

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

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

 

>あるレコードの1行目は、

record.テーブルのフィールドコード.value[0].value

で取得できます([0]が1番め、という意味)。

ご教示頂きありがとうございます。

 

>具体的にどのタイミング(アプリを開いた時?)でやるのか

10月なら10月でその月一番最初にアプリを開いた時に実装できればと思っております。

 

>アプリの構造(◯月分がいっぱいあるのか、重複があるのか、など)がどうなっているか、

現在2022年の1月~12月分までそれぞれあり、2023年になったら2023年の1月~12月分までを作成する予定です。

 

nekoko様

・月の一番最初にアプリを開いたら実行
・12レコード/年生成,年始にレコード生成
となると,
①一覧表示後または一覧表示後にボタンをクリックしたとき(ボタンは一覧表示後に生成)
②「締め日が当月のレコード」を取得
③「締め日が前月のレコード」を取得
④前月のレコードの残金を当月のレコードのテーブル1行目にコピー
という流れでしょうか.
②,③についてはAPIでできそうに思います.

TO様

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

 

教えて頂いた流れに沿ってコードを作成していこうと思います。

①、④に関しては過去に作成したコード参考に実装できると思われます。

②、③に関してはチュートリアル等を参考に組んでみようと思います。

 

全体の流れを簡潔にまとめたうえで、ご教授して頂きありがとうございます。

分からない事が出てきましたら再度ご質問させていただきますので、その際は宜しくお願い致します。

TO様

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

 

流れに沿ってコードを作成してみたのですが上手くボタンが表示されません。

ボタン配置のみのコードはしっかりと動作することは確認できました。

助言を頂けないでしょうか。

 

(コード)

(() => {
  'use strict';
  //現在日時を取得
    var now = new Date();
    var nowDate = now.getTime();
 //1ボタンの設置
  kintone.events.on('app.record.index.show', (event) => {
    if (document.getElementById('my_index_button') !== null) {
    }
    const myIndexButton = document.createElement('button');
    myIndexButton.id = 'my_index_button';
    myIndexButton.innerText = '繰越ボタン';
    //2当月のレコードを取得
    kintone.app.getFieldElements(now.getTime = '〆日' );
    //3前月のレコードを取得
 kintone.app.getFieldElements('〆日' < now.getTime-'months', 1 );
    //4 ボタンクリック時の処理
    myIndexButton.onclick = () => {
     kintone.app.record.set(record.申請フォーマット.value[7].value
    )};
     kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
     return event;
  });
})();

 

エラー

一つ目のエラー(Uncaught SyntaxError: Unexpected token ‘}’)

 kintone.app.getFieldElements('〆日' < now.getTime-'months', 1 );

二つ目のエラー(index.js:125 )

{throw a;},0)},dl=function(a,b){al||bl();cl||(al(),cl=!0);Wk.add(a,b)},bl=function(){if(m.Promise&&m.Promise.resolve){var a=m.Promise.resolve(void 0);al=function(){a.then(el)}}else al=function(){var b=el;"function"!==typeof m.setImmediate||

 

宜しくお願い致します。

 

nekoko様

kintone.app.getFieldElements(now.getTime ='〆日');

getFieldElementsにはフィールドコードしか指定できないのですが,これだとフィールドコードの指定になっていないと思います.
レコード一覧情報取得(…の「フィールド要素を取得する」参照)
当月も同様と思います.

ボタン押して…となると,event.recordsが使えないので,
APIを使って,
”フィールドコード「〆め日」の値が先月末から今月末”
という条件(クエリ)でレコードを取得(GET)します.
レコードの取得(GET)
(引用は一括取得ですが,1件ずつ取得する(前月,当月で2回分)でも良いと思います)
GETさえできれば,あとは値を格納してAPIでPUTするような流れになるのかな?と思います.
ちなみにrecord.setは一覧画面では使えないみたいです.
レコード詳細情報取得(…の「レコードに値をセットする」の利用できる画面に一覧画面はありませんでした)

「ボタン」ならこうなりますが,アプリ起動時であれば,revent.recordsでレコード情報が取得(表示されているだけ)できて,
値をセットするのもreturn eventで済むので,楽といえば楽です.

どちらが良いかは,nekokoさんの環境などを加味して検討ください.

TO

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

環境上、ボタンを設置しての運営の方が使い勝手が良いので貼ってくださったリンクを参考にボタンを設置しようと思います。

 

>ちなみにrecord.setは一覧画面では使えないみたいです。
レコード詳細情報取得(…の「レコードに値をセットする」の利用できる画面に一覧画面はありませんでした)

この件に関してなのですが、ボタンを詳細画面に設置する場合には、 record.set は使用することが出来るのでしょうか。

nekoko

レコード詳細情報取得
ここにある通り、record.setは追加、編集でしか使えないようです。

詳細画面でも、一覧画面(ボタンなら)でもAPIのPUTを使うことになると思います。
レコードの更新(PUT)

TO

お世話になってります。

返信遅くなり申し訳ございません。

 

record.set は使用できないとの事ですので教えて頂いたリンクを参考にAPIのPUTを用いてコードを作成していこうと思います。

リンク付きでのご教授ありがとうございます。

 

TO様 

お世話になっております

 

メインで使用する者とはなし、レコードの編集画面にボタンを配置することになり、コードの作成をしたのですが複数エラーが出ており、現在修正をしている状況です。18行目 getQuery(〆日 = THIS_MONTH(LAST)); にて

Uncaught ReferenceError: THIS_MONTH is not defined at myIndexButton.onclick

というエラーが出ており、このエラーだけ修正することが出来ておりません。

また取得した現在日時をIF条件に組み込む必要があるのでしょうか。

ご教授して頂けますと幸いです。

 

(() => {
  'use strict';
  //現在日時を取得
    var now = new Date();
    var nowDate = now.getTime();
 
 //1ボタンの設置
    kintone.events.on('app.record.edit.show', (event) => {
    // メニューの上側の空白部分にボタンを設置
    const myIndexButton = document.createElement('button');
    myIndexButton.id = 'my_index_button';
    myIndexButton.innerText = '繰越';
    
    //ボタンクリック時の処理
    myIndexButton.onclick = () => {
      
      //当月のレコードを取得
 kintone.app.getQuery(〆日 = THIS_MONTH(LAST));
    
    //前月のレコードを取得
 kintone.app.getQuery(〆日 = LAST_MONTH(LAST));
 ///条件付き処理
 if (〆日 = THIS_MONTH(LAST)) {
 if (〆日 = LAST_MONTH(LAST)) {
var record = kintone.app.record.get(残高);
    kintone.app.record.set(record.入金記録.value[7].value = '残高' )};
  };
  };
kintone.app.record.getHeaderMenuSpaceElement().appendChild(myIndexButton);
return event;
  
});
})();

 

 

nekoko様

getQueryには引数が無いようです.
kintone.app.getQuery

また,kintone.app.record.get,setもコードの記載が適切ではないようです.
レコード詳細情報取得

上記を参考にされると良いかと思います.

TO様 

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

>getQueryには引数が無いようです.

そうだったのですね、引数があると思っておりました。

 

教えて頂いたリンクを見ながら一つ一つコードを作成していこうと思います。

 

何度も質問に答えて頂きありがとうございます。

TO

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

コードについてなのですが、動作確認をしたところアラートは表示されるのですが、レコード自体は何も変化はなく、コンソールで確認をしましたがエラーは出ておりません。

ご教授して頂けないでしょうか。

(コード)

(() => {
  'use strict';
  //日付の取得(後で使用)
  var date = new Date();
  var last_month = new Date(date.getFullYear(), date.getMonth()-1, date.getDate()); ///先月
  var last_date = new Date(date.getFullYear(), date.getMonth()+1, 0);              ///月末

 //ボタンの設置
    kintone.events.on('app.record.edit.show', (event) => {
    // メニューの上側の空白部分にボタンを設置
    const myZandakCopyButton = document.createElement('button');
    myZandakCopyButton.id = 'my_copy_button';
    myZandakCopyButton.innerText = '繰越ボタン';
         
//ボタンクリック時の処理
    myZandakCopyButton.onclick = () => {
 ///最初に取得した日付を利用する
   if ('〆日'==(last_month  < date && last_date> date)){   
     ///下3行のコピー処理がされない
   var record = kintone.app.record.get(record.〆日=last_month.value['残高'].value ); 
   kintone.app.record.set(record.入金記録.value[7].value);
   kintone.app.record.set(record.〆日=last_date.value['残高'].value)}
   alert('繰越ました');   ///動く
    };
   kintone.app.record.getHeaderMenuSpaceElement( 'my_copy_button').appendChild (myZandakCopyButton);
   return event;
});
})();

nekoko様

参考例としてコードを記載します.
下記コードは,
①編集画面でボタンをクリックすると,
②「〆日」が先月のレコードをすべてGET
③(該当するレコードは一つしかないはずなので)GETした配列の1番目の残高をクリックした画面のレコードに転記
…という作業を行っています.
nekoko様のコードの//ボタンクリック時の処理の中身と思ってください.

 //ボタンクリック時の処理
myZandakCopyButton.onclick = () => {
//残金を格納するレコード
 const myRec = kintone.app.record.get();
  
  //GET用body
  const body = {
    app: kintone.app.getId(),
  query: '〆日 >= LAST_MONTH(1) and 〆日 <= LAST_MONTH(LAST)',    
  };
 
 //GET
  kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body, (resp) => {
    // success
    console.log(resp);
    myRec.record.残高.value = resp.records[0].残高.value;
    kintone.app.record.set(myRec);
    
  }, (error) => {
    // error
    console.log(error);
  });
 }

細かいところはわからないのでシンプルなつくりにしています.
上記コードは下記を参考にしています.
>GET
レコードの取得(GET)
(…のレコードの一括取得(クエリで条件を指定)と「query」パラメータで利用可能な演算子と関数)
>kintone.app.record.get() / set()
レコード詳細情報取得

なお,上記コードはクリックした時を基準にしているので,
ボタンクリックが1箇月以上遅くなると想定通りGETできないリスクがあります.
また,「先月の残金を転記する」ことしかしていませんので,
入金記録?などについては適宜対応ください.

参考になれば幸いです.

 

TO

お世話になっております。返信遅くなり申し訳ございません。

 

レコード及び参考にしたページのリンクありがとうございます。

ご教授して頂いたレコードを参考に当月のテーブル(入金記録)の1行目の対象レコード及び、残高へコピー出来るように追記していこうと思います。

 

 

TO

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

 

ご教授して頂いたコード用いて使用環境に合わせて変更しているのですが、うまく反映されません。

現在、アラートのみ正常に作動しております。

原因の箇所は17行目の app: kintone.app.getId(), なのではないかと考えております。

(コード)

(() => {
  'use strict';
 //ボタンの設置
    kintone.events.on('app.record.edit.show', () => {
    // メニューの上側の空白部分にボタンを設置
    const myZandakCopyButton = document.createElement('button');
    myZandakCopyButton.id = 'my_copy_button';
    myZandakCopyButton.innerText = '繰越ボタン';
         
 //ボタンクリック時の処理
  myZandakCopyButton.onclick = () => {   //アラートのみ動いている
  //残金を格納するレコード
 const myRec = kintone.app.record.get(); 
  
  //GET用body
  const body = {
    app: kintone.app.getId(),        //IDが定義されていない
    query: '〆日 >= LAST_MONTH(1) and 〆日 <= LAST_MONTH(LAST)',  
  };
 
 //GET
 return kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body, (resp) => {
    // success
    console.log(resp);
    myRec.record.残高.value = resp.records[0].残高.value;
    kintone.app.record.set(myRec); 
   
   //ボタンクリック時に表示
     alert('繰越ました');
  
    
  }, (error) => {
    // error
    console.log(error);
    
  });
 };
   kintone.app.record.getHeaderMenuSpaceElement('my_copy_button').appendChild (myZandakCopyButton);
   return event;
});
})();

(エラー)

 

nekoko

エラーの内容は「$idが読めません」という主旨で、提示したコード内には該当箇所がありません。
($idはレコード番号に当たるのですがこのコードでは使っていません)

他にjavascriptを適用していませんか?
なおエラーの直後にrecords:array(1)とあるので、取得はできていそうです。
 alert(‘繰越ました’);の、あとにreturn eventを、いれてみてください。

 alert('繰越ました');
return event;

これで反映はされると思います。

 

TO

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

 

残高フィールドが数値フィールドではなく計算フィールドになっていた為、反映がされておりませんでした。

コピー先を数値フィールドにしたところ正常に動いていることを確認できました。

 

TO様がご教授して下さったことにより、コピー先にテーブル内のフィールドを一つ追加できれば運用できるところまで来ました。

コピー先の追加はご教授して頂いたことを参考に追加しようと思います。

1から1つずつ丁寧にご教授していてだきありがとうございました。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。