質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
kintone

kintone(キントーン)とは、サイボウズ社が提供する業務改善プラットフォームです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

561閲覧

Looker Studioのkintone用コネクタを作成中だがデータが100件以上取得できない

kinpika

総合スコア30

kintone

kintone(キントーン)とは、サイボウズ社が提供する業務改善プラットフォームです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2024/03/11 11:15

編集2024/03/21 07:30

実現したいこと

Looker Studio(旧データポータル)のコネクタを自作し、REST APIからデータを取得する
https://weseek.co.jp/tech/3521/
を参考に、kintone用のLookerStudioコネクタをGoogle Apps Scriptで作成しています。

発生している問題・分からないこと

約5000件ほどあるデータを取り込んでLookerStudioに反映しようとしたところ、
コネクタはなんとか作成できたもののデータが100件以上取得できず困っています。

該当のソースコード

var cc = DataStudioApp.createCommunityConnector(); function getAuthType() { var AuthTypes = cc.AuthType; return cc .newAuthTypeResponse() .setAuthType(AuthTypes.NONE) .build(); } function getConfig(request) { var config = cc.getConfig(); config.newInfo() .setId('instructions') .setText('Enter the kintone App ID to get a list of records from the app.'); config.newTextInput() .setId('app_id') .setName('Enter an app ID'); config.setDateRangeRequired(true); return config.build(); } function getFields(request) { var cc = DataStudioApp.createCommunityConnector(); var fields = cc.getFields(); var types = cc.FieldType; var aggregations = cc.AggregationType; fields.newDimension() .setId('record_id') .setName('レコード番号') .setType(types.NUMBER); fields.newDimension() .setId('updated_at') .setName('更新日時') .setType(types.YEAR_MONTH_DAY_SECOND); return fields; } function getSchema(request) { var fields = getFields(request).build(); return { schema: fields }; } function getData(request) { var requestedFieldIds = request.fields.map(function(field) { return field.name; }); var requestedFields = getFields().forIds(requestedFieldIds); // Fetch and parse data from kintone API var url = 'https://<サブドメイン>.cybozu.com/k/v1/records.json?app=' + request.configParams.app_id + '&totalCount=true'; var headers = { 'X-Cybozu-API-Token': PropertiesService.getScriptProperties().getProperty("KINTONE_API_TOKEN") }; var options = { 'headers': headers }; var response = UrlFetchApp.fetch(url, options); var parsedResponse = JSON.parse(response); var kintonerecords = parsedResponse.records; var rows = responseToRows(requestedFields, kintonerecords); return { schema: requestedFields.build(), rows: rows }; } function responseToRows(requestedFields, response) { return response.map(function(record) { var row = []; requestedFields.asArray().forEach(function (field) { switch (field.getId()) { case 'record_id': return row.push(record.$id.value); case 'updated_at': return row.push(record.更新日時.value.replace(/-|:|T|Z/g, '')); // 他のフィールドに対する処理を追加する default: return row.push(''); } }); return { values: row }; }); }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Kintone公式の複数のレコードを取得する等を読んで色々試しては見ましたが、どれも100件以上取得することはできませんでした。

function getData(request) { var requestedFieldIds = request.fields.map(function(field) { return field.name; }); var requestedFields = getFields().forIds(requestedFieldIds); // Fetch and parse data from kintone API var url = 'https://<サブドメイン>.cybozu.com/k/v1/records.json?app=' + request.configParams.app_id + '&totalCount=true'; var headers = { 'X-Cybozu-API-Token': PropertiesService.getScriptProperties().getProperty("KINTONE_API_TOKEN") }; var options = { 'headers': headers }; var allRecords = []; var offset = 0; var limit = 100; // 1ページあたりの最大レコード数 var totalCount = 0; do { var pageUrl = url + '&offset=' + offset + '&limit=' + limit; var response = UrlFetchApp.fetch(pageUrl, options); var parsedResponse = JSON.parse(response.getContentText()); var pageRecords = parsedResponse.records; allRecords = allRecords.concat(pageRecords); offset += limit; totalCount = parsedResponse.totalCount; } while (offset < totalCount && offset < 1000); // 最大1000件まで取得 var rows = responseToRows(requestedFields, allRecords); return { schema: requestedFields.build(), rows: rows }; }

例えば、getData(request) をこのように改良したりしてみましたが、
100件以上取得できず四苦八苦しています。

また、参考元の記事に下記のような文言がありますが、

Redmine REST API は、 1 回のリクエストで 100 件までのデータしか取得できません。 100 件を超えるデータに対応するためには、ページを再帰的に追いかける実装が必要です。

「ページを再帰的に追いかける実装」とはどのような意味なのでしょうか?
参考になるページ等ありましたらお教え頂けると幸いです。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2024/03/12 03:41

いろいろ試した内容を具体的に記載していただければ指摘できるかもしれませんが.... > 「ページを再帰的に追いかける実装」 https://weseek.co.jp/tech/3521/ の Redmine API の例で言えば、API のドキュメント ( https://www.redmine.org/projects/redmine/wiki/Rest_Issues ) を見るとリクエストパラメータに offset という何番目から読み込むというパラメータがありますので、それを必要に応じて変更しながら必要な回数だけリクエストを実行します。( 一度に100 件取得するのであれば、1, 101, 201, … と繰り返して実行します。 )
guest

回答1

0

自己解決

kintoneレコードをスプレッドシートに転記(GAS)
https://yu-syan.sakura.ne.jp/?p=1675

上記のページ&Claude Aiを参考に自己解決しました。

var cc = DataStudioApp.createCommunityConnector(); //コネクタの認証方法を返す関数を設定 function getAuthType() { var AuthTypes = cc.AuthType; return cc .newAuthTypeResponse() .setAuthType(AuthTypes.NONE) .build(); } //コネクタ追加時にkintoneアプリのIDを入力してレコードのリストを取得するように指示 function getConfig(request) { var config = cc.getConfig(); config.newInfo() .setId('instructions') .setText('Looker Studioに接続するkintoneのアプリIDを入力してください'); config.newTextInput() .setId('app_id') .setName('kintoneのアプリID'); config.setDateRangeRequired(true); return config.build(); } //kintoneアプリから取得可能なフィールドを定義 function getFields(request) { var cc = DataStudioApp.createCommunityConnector(); var fields = cc.getFields(); var types = cc.FieldType; fields.newDimension() .setId('record_id') .setName('レコード番号') .setType(types.NUMBER); fields.newDimension() .setId('updated_at') .setName('更新日時') .setType(types.YEAR_MONTH_DAY_SECOND); return fields; } //リクエストされたフィールドに対応するスキーマを取得 function getSchema(request) { var fields = getFields(request).build(); return { schema: fields }; } //kintone APIからデータを取得し、Looker Studioで使用できる形式に変換 function getData(request) { var requestedFieldIds = request.fields.map(function(field) { return field.name; }); var requestedFields = getFields().forIds(requestedFieldIds); // Fetch and parse data from kintone API var appId = request.configParams.app_id; var apiToken = PropertiesService.getScriptProperties().getProperty("KINTONE_API_TOKEN"); var limit = 500; var offset = 0; var allRecords = []; while (true) { var url = 'https://<サブドメイン>.cybozu.com/k/v1/records.json?app=' + appId + '&query=' + encodeURIComponent('limit ' + limit + ' offset ' + offset); var headers = { 'X-Cybozu-API-Token': apiToken }; var options = { 'headers': headers }; var response = UrlFetchApp.fetch(url, options); var parsedResponse = JSON.parse(response); var kintoneRecords = parsedResponse.records; allRecords = allRecords.concat(kintoneRecords); if (kintoneRecords.length < limit) { break; } offset += limit; } var rows = responseToRows(requestedFields, allRecords); return { schema: requestedFields.build(), rows: rows }; } // kintoneからのレスポンスをLooker Studioの行形式に変換 function responseToRows(requestedFields, response) { return response.map(function(record) { var row = []; requestedFields.asArray().forEach(function (field) { switch (field.getId()) { case 'record_id': return row.push(record.$id.value); case 'updated_at': return row.push(record.更新日時.value.replace(/-|:|T|Z/g, '')); } }); return { values: row }; }); } // エラーが起きたときにデバッグに必要な詳細の説明が得られる関数を設定 function isAdminUser() { return true; }

投稿2024/03/26 02:22

編集2024/03/26 02:25
kinpika

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問