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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

2528閲覧

カーソルAPIを使ったGASでのkintoneレコード一括取得からスプレッドシートへの500件以上の出力について

kinpika

総合スコア30

kintone

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/10/25 08:07

前提

https://www.shanaidx.com/kintone_data_get/ 
を参考に、kintoneアプリからGASでレコード情報を取得、
取得したデータをスプレッドシートに出力したいと思っています。

解決策をご存じの方がいらっしゃいましたらご教授お願いします。

問題点

レコード情報を取得→取得したデータをスプレッドシートに出力までは上手くいったが、500件以上のデータが書き込めず困っています(※元のアプリのデータは5000件あります)

コードの位置を変えてみたりしたがなかなかうまくいかないので、500件以上アプリのデータがある場合のスプレッドシートの出力方法を、もしくはヒントを教えてほしいです。

ソースコード

const api_url = 'https://xxxxxxxx.cybozu.com/'; const authorization = encodeBase64Text('xxxxxxxx:xxxxxxxx'); function myFunction() { let app_id = 16; let data = { 'app':app_id, 'fields': ['レコード番号','レコード作成日時','メールアドレス','チェック'], 'query': 'レコード作成日時 = THIS_YEAR() order by レコード番号 asc', 'size': 500 } let result = CreateCursor(data); let records_data = GetCursor(result.id); console.log(records_data.records);//consoleにレコード情報を表示  //レコード情報をすべて取得するまで繰り返す while(records_data.next){ records_data = GetCursor(result.id); console.log(records_data.records);//consoleにレコード情報を表示 // 取得したデータを整形 var output = []; records_data["records"].forEach(function(record){ var row = []; row.push(record["レコード番号"].value); row.push(Utilities.formatDate(new Date(record["レコード作成日時"].value), 'JST', 'yyyy/M/d HH:mm')); row.push(record["メールアドレス"].value); row.push(record["チェック"].value); output.push(row); }); // スプレッドシートに出力 var sheetOutput = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1'); sheetOutput.getRange(2, 1, output.length, output[0].length).setValues(output); } } //カーソルの作成 function CreateCursor(data) { let headers = { 'Content-Type':'application/json', 'X-Cybozu-Authorization':authorization }; let options = { 'method' : 'post', "headers" : headers, 'payload' : JSON.stringify(data) }; let response = UrlFetchApp.fetch(api_url+'/k/v1/records/cursor.json', options); return JSON.parse(response); } //カーソルIDからレコード情報の取得 function GetCursor(id) { let headers = { //'Content-Type':'application/json', 'X-Cybozu-Authorization':authorization }; let options = { 'method' : 'get', "headers" : headers }; let response = UrlFetchApp.fetch(api_url+'/k/v1/records/cursor.json?id='+id, options); return JSON.parse(response); } // Base64エンコード function encodeBase64Text(text) { return Utilities.base64Encode(text, Utilities.Charset.UTF_8) }

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記のように、一回書き込むたびに書き込み開始行をずらしていけばよいのではないでしょうか。

js

1function myFunction() { 2 let app_id = 16; 3 let data = { 4 'app':app_id, 5 'fields': ['レコード番号','レコード作成日時','メールアドレス','チェック'], 6 'query': 'レコード作成日時 = THIS_YEAR() order by レコード番号 asc', 7 'size': 500 8 } 9 let result = CreateCursor(data); 10 let records_data = GetCursor(result.id); 11 console.log(records_data.records);//consoleにレコード情報を表示 12 13 // 出力対象のスプレッドシート 14 var sheetOutput = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1'); 15 // 書き込み開始行 16 let line = 2; 17 //レコード情報をすべて取得するまで繰り返す 18 while(records_data.next){ 19 records_data = GetCursor(result.id); 20 console.log(records_data.records);//consoleにレコード情報を表示 21 22 // 取得したデータを整形 23 var output = []; 24 records_data["records"].forEach(function(record){ 25 var row = []; 26 27 row.push(record["レコード番号"].value); 28 row.push(Utilities.formatDate(new Date(record["レコード作成日時"].value), 'JST', 'yyyy/M/d HH:mm')); 29 row.push(record["メールアドレス"].value); 30 row.push(record["チェック"].value); 31 32 output.push(row); 33 }); 34 35 sheetOutput.getRange(line, 1, output.length, output[0].length).setValues(output); 36 line += output.length; 37 } 38}

投稿2022/10/25 10:31

編集2022/10/25 10:39
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kinpika

2022/10/26 09:17

ありがとうございます!! qnoirさんから頂いた回答を元にコードを修正した結果、上手く思い通りの動作ができるようになりました!
kinpika

2022/10/26 09:24

最終的に以下のようになりました function myFunction() { // 出力対象のスプレッドシート let sheetOutput = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1'); // 書き込み開始行 let line = 2; let app_id = 16; let data = { 'app':app_id, 'fields': ['レコード番号','レコード作成日時','メールアドレス','チェック'], 'query': 'レコード作成日時 = THIS_YEAR() order by レコード番号 asc', 'size': 500 } let result = CreateCursor(data); let records_data = GetCursor(result.id); console.log(records_data.records);//consoleにレコード情報を表示 // 取得したデータを整形 var output = []; records_data["records"].forEach(function(record){ var row = []; row.push(record["レコード番号"].value); row.push(Utilities.formatDate(new Date(record["レコード作成日時"].value), 'JST', 'yyyy/M/d HH:mm')); row.push(record["メールアドレス"].value); row.push(record["チェック"].value); output.push(row); }); sheetOutput.getRange(line, 1, output.length, output[0].length).setValues(output); line += output.length; //レコード情報をすべて取得するまで繰り返す while(records_data.next){ records_data = GetCursor(result.id); console.log(records_data.records);//consoleにレコード情報を表示 // 取得したデータを整形 var output = []; records_data["records"].forEach(function(record){ var row = []; row.push(record["レコード番号"].value); row.push(Utilities.formatDate(new Date(record["レコード作成日時"].value), 'JST', 'yyyy/M/d HH:mm')); row.push(record["メールアドレス"].value); row.push(record["チェック"].value); output.push(row); }); sheetOutput.getRange(line, 1, output.length, output[0].length).setValues(output); line += output.length; } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問