レコード一括取得の質問です

現在のアプリのフィルターの条件を使用したいと思っています。

getQueryConditionで取得した条件を一括取得の条件にするには

「query = 」のあとなんと記述して代入したら良いのか教えていただけませんか?

 

ももたす様

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

トヨクモの江田と申します.

URLエンコードしたものを用いると良いです.

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

'...query' + encodeURIComponent(kintone.app.getQueryCondition())

また,kintone.api()を用いれば,より簡単にkintone REST APIを利用できます.
https://developer.cybozu.io/hc/ja/articles/202166310#step1

kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
app: kintone.app.getId(),
query: kintone.app.getQueryCondition()
}).then(function(response){
console.log(response);
});

江田篤史様

お世話になっております、ももたすです。

上記件大変参考になりました。

また、REST APIを用いたサンプルスクリプトもありがとうございます。

コンソール画面にて、動作されていることが確認できました。

下記の話なのですが、お時間がありましたら教えてください。

今回上記で取得した一覧を違うアプリの新規レコードのテーブルへとデータをもっていきたいです。

雑なスクリプトに見えると思うのですが、第9回REST APIを用いたレコードの追加や他の方の質問を見て考えて作成したのですが、

下記のようなスクリプトになるのではないかと考えています。

しかしながら、せっかくとれたデータの使い方も扱いをどうしていいのかわからないので、教えて頂きたいです。

 

(function() {
“use strict”;
kintone.events.on(‘app.record.index.show’, function(event) {
if (document.getElementById(‘my_index_button’) !== null) {
return;
}

var myIndexButton = document.createElement(‘button’);
myIndexButton.id = ‘my_index_button’;
myIndexButton.innerText = ‘一覧の取得と移動’;

myIndexButton.onclick = function() {
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’,param, function (resp) {
var param = {
‘app’ : kintone.app.getId(),
‘query’ : kintone.app.getQueryCondition(),
‘fields’ : [‘種類’]
}
}); //ここまでが取得する動きと認識しています。

var otherAppId = 322;
var requestParam = {
‘app’ : otherAppId, //ここから先のparamの代入の仕方がわからないです。

kintone.api(‘/k/v1/record’,‘POST’, requestParam);
};
});
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
};
});
})();

ももたす様

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

下記記事のリクエストボディの構造に合うよう,「resp.records」からサブテーブルの「value」を作成すれば良いと思います.
https://developer.cybozu.io/hc/ja/articles/202166160

下記のようになるかと思います.
「otherAppTableFieldCode」,「otherAppFieldCode*」,「selfAppFieldCode*」のあたりは,ご自身のフォーム設定に合わせて適宜変更してください.

(function () {
  "use strict";
  kintone.events.on('app.record.index.show', function (event) {
    if (document.getElementById('my_index_button') !== null) {
      return;
    }
    var myIndexButton = document.createElement('button');
    myIndexButton.id = 'my_index_button';
    myIndexButton.innerText = '一覧の取得と移動';
    myIndexButton.onclick = function () {
      var param = {
        'app': kintone.app.getId(),
        'query': kintone.app.getQueryCondition(),
        'fields': ['種類']
      }
      kintone.api(kintone.api.url('/k/v1/records', true), 'GET', param).then(function (resp) {
        var otherAppId = 322;
        var requestParam = {
          app: otherAppId,
          record: {
            otherAppTableFieldCode: {
              value: resp.records.map(function(record){
                return {
                  value: {
                    otherAppFieldCode1: {
                      value: record.selfAppFieldCode1.value
                    },
                    therAppFieldCode2: {
                      value: record.selfAppFieldCode2.value
                    },
                    therAppFieldCode3: {
                      value: record.selfAppFieldCode3.value
                    }
                  }
                }
              })
            }
          }
        };
        kintone.api('/k/v1/record', 'POST', requestParam);
      });
    };
    kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
  });
})();

江田篤史様

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

上記ですんなり移動してくれました。

スクリプトの修正もどうもありがとうございます。

私が書いてたスクリプトにはひどいことにテーブルの条件に使用したかった内容も種類の他何も書いてなかったですね。

すみませんでした。

すんなりいったのはよかったのですが、問題が起きておりまして、

条件で取得してくるフィールドは

‘fields’: [‘種類’,‘内容’,‘備考’]

なのですが、うまく動作してくれるからエラーにはならなかったのですが、

レコード分のテーブルは作ってくれても、何もデータが入っていなかったのです。

上記の条件の「内容」と「備考」は空白であることもあるのですが、それが関係していますか?

また、レコードを作成させてしまう、ではなく、保存前の画面でとめておくことってできますか?(なので、自分は移動させたいアプリにいくことになると思うのですが。。)

ももたす様

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

・レコード分のテーブルは作ってくれても、何もデータが入っていなかった
私の環境では再現できませんでした.
「内容」と「備考」が空白でも問題はないかと思います.
各アプリのフィールドコードと一致しているか,今一度ご確認いただけますか?

・レコードを作成させてしまう、ではなく、保存前の画面でとめておくことってできますか?
他アプリのレコード作成画面に飛んで,テーブルに値を入れた状態にするということでよろしいでしょうか?
その場合は他アプリ側でもJSを読み込む必要があります.

自アプリのJS

(function () {
  "use strict";
  kintone.events.on('app.record.index.show', function (event) {
    if (document.getElementById('my_index_button') !== null){
      return;
    }
    var myIndexButton = document.createElement('button');
    myIndexButton.id = 'my_index_button';
    myIndexButton.innerText = '一覧の取得と移動';
    myIndexButton.onclick = function () {
      kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
        app: kintone.app.getId(),
        query: kintone.app.getQueryCondition(),
        fields: ['種類', '内容', '備考']
      }).then(function (resp) {
        var otherAppId = 322;
        var window2 = open('/k/' + otherAppId + '/edit');
        window2.originAppRecords = resp.records;
      });
    };
    kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
  });
})();

他アプリのJS

(function () {
  "use strict";
  kintone.events.on('app.record.create.show', function (event) {
    if (!window.originAppRecords){
      return;
    }
    event.record.テーブル.value = originAppRecords.map(function(record){
      return {
        value: {
          種類: {
            type: record.種類.type,
            value: record.種類.value,
          },
          内容: {
            type: record.内容.type,
            value: record.内容.value,
          },
          備考: {
            type: record.備考.type,
            value: record.備考.value,
          }
        }
      }
    });
    return event;
  });
})();

江田篤史様

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

>私の環境では再現できませんでした.
>「内容」と「備考」が空白でも問題はないかと思います.
>各アプリのフィールドコードと一致しているか,今一度ご確認いただけますか?

一部フィールドコードが違うのがありましたが、あとの原因は

value: resp.records.map(function(record){
return {
value: {
種類: {
value: record.種類.value
},

↑の種類にシングルクォートを付けてしまったことでした。

シングルクォートを削除することで実装ができました!

 

>他アプリのレコード作成画面に飛んで,テーブルに値を入れた状態にするということでよろしいでしょうか?
>その場合は他アプリ側でもJSを読み込む必要があります.

認識合っております。

頂いたスクリプトで実現ができました。

すみません、たくさんのお時間を割いて頂いて本当に感謝しております。

最後にもう1つだけ教えてください。

「originAppRecords.map」はどういうところで使用するものなのでしょうか。

「originAppRecords.map」を調べるとURLを取得できなかったとなるので、どう使っているのかと思いまして。。

ももたす様

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

「originAppRecords」は、自アプリのJSの18行目で作成しています。
1行前の「open()」で作成した新規ウィンドウのグローバル変数として宣言しています。
また、kintone REST APIで取得した、「res.records」を代入しています。
よって、「originAppRecords」は配列となります。

「map()」は、配列のメソッドです。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map

平たく言えば、
「originAppRecords」は勝手に作った配列で、元からあるものではないです。
「map()」はどの配列にも備わっている便利機能です。

江田篤史様

申し訳ないくらいお世話になっております。

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

今後私は教えて頂いたスクリプトと共存していくことになりますので、

マスターできるように頑張ります。

最後まで丁寧に教えてくださったこと、本当に感謝しております。

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