実現したいこと
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 件を超えるデータに対応するためには、ページを再帰的に追いかける実装が必要です。
「ページを再帰的に追いかける実装」とはどのような意味なのでしょうか?
参考になるページ等ありましたらお教え頂けると幸いです。
補足
特になし
回答1件
あなたの回答
tips
プレビュー