logging output too large. truncating output.の対策
GASでスクリプトを実行したときに、実行ログに「logging output too large. truncating output.」と表示されることがあります。これは、ログが省略された形で表示されており出力の全体像が見えない状態です。
思ってた出力と異なる、確認したい肝心のログを確認できないといったお困りの方向けに、どのような要因で起きる事象なのか、その対策方法をご紹介します。
「logging output too large. truncating output.」とは?
「logging output too large. truncating output.」は、一度に出力するテキストが長すぎる場合に表示されます。出力されている以外のデータも存在しているものの、1回の呼び出しのみで表示しきれていないた目に表示されるもので、エラーではありません。
「truncate/truncating」の意味は「切り捨てる/端数処理」の意味なので、文章をそのまま『短縮された表示です』というわけですね。
要因
「logging output too large. truncating output.」が表示される要因は、一度の出力で表示される文字数が多すぎるためです。
GASでは、1度のログの出力文字数の限界として、8192文字を超えると出力が省略される仕様になっています。
例えば、URL Fetchで取得したレスポンスをそのまま出力すると、ページ内のHTMLテキストをすべてアウトプットしようとするので出力制限に引っかかります。
function myFunction() {
const url = 'https://cookpad.com/recipe/7018658'
const respose = UrlFetchApp.fetch(url);
const content = respose.getContentText();
console.log(content);
}
出力文字数以外にも、GASには注意すべき制限があります。詳しくは以下の記事で解説しています。
対策方法
出力全体をログとして表示するには何通りか対策があります。状況に応じて選択してみてください。
①ログを分割して出力する
ループ内で出力をログに記録し、すべての要素を出力します。下記のスクリプトでは、改行(\n)で分割して1行ずつ出力するようにしています。
function myFunction() {
const url = 'https://cookpad.com/recipe/7018658'
const respose = UrlFetchApp.fetch(url);
const content = respose.getContentText();
const output = content.split('\n');//改行で分割して1行ごとに要素とした配列
for(let i=0;i<output.length;i++){
console.log(output[i]);
}
}
先ほどと異なり1行ずつ出力されていますね。
②ファイルに書き出す
コンソール内で見れないのであれば、書き出しまえという対策です。
function myFunction() {
const folderId ='[出力先フォルダのID]';
const url = 'https://cookpad.com/recipe/7018658'
const respose = UrlFetchApp.fetch(url);
const content = respose.getContentText();
//fileNmae
const fileName = 'output_file';
// コンテンツタイプ
const contentType = 'text/plain';
// 文字コード
const charset = 'UTF-8';
// 出力先のフォルダ
const folder = DriveApp.getFolderById(folderId);
// Blob作成
const output_file = Utilities.newBlob('', contentType, fileName).setDataFromString(content, charset);
// ファイルに保存
folder.createFile(output_file);
}
出力先に指定したフォルダにうまくファイルが作成されています。
③スプレッドシートに書き出す
コンソール内で見れないのであれば、書き出しまえという対策その2です。
後述の理由でファイルに書き出してしまったほうが楽だったりもしますが、GASの処理でスプレッドシートの扱いに扱うことも多いので、スプレッドシートに書き出すほうが慣れているという方も多いかもしれません。
スプレッドシート側の制限として1セルに書き込める文字数が50,000文字という上限があるのでその点だけ注意してください。その場合でも行を分けて出力すればよいので、スプレッドシート内の作業であればすぐに確認ができるというメリットもあります。
下記のスクリプトではgoogle.comトップのHTTPレスポンスを書き出しています。
function myFunction() {
const url = 'https://www.google.com/'
const respose = UrlFetchApp.fetch(url);
const content = respose.getContentText();
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet()
const range = sheet.getActiveRange().setValue(content);
}
まとめ
実行ログに「logging output too large. truncating output.」と表示される要因とその対策についてご紹介しました。