質問: Utilities.formatDate( now, 'Asia/Tokyo', 'yyyyMMddHHmm'); // アクティブシート名+現在日時 return sheet.getName() + '_' + datetime + '.csv'; } ``` ``` ``` ### 補足情報(FW/ツールのバージョンなど) https://qiita.com/ayies128/items/315f161bc14c36327fcd こちらのサイトのコードを使わせていただいております。 よろしくお願いします。
回答: > > データが入っている分だけ書き出したいのですが、現状はデータが入っていない部分まで書き出されてしまいます。 > > > データがまったく入っていない行が出力される、と言うことでしょうか。`getDataRange().getValues()` を使っているので通常は「データが存在する範囲」だけ取得できるはずなのですが。データの追加や編集を続けている中で、下の方の行で見えない空白データなどが入ったままとなっていて、それらが出力されてしまっているかもしれません。 そんな場合は、スプレッドシートのデータをCSV形式のデータに出力している部分でスキップさせてしまえば良いと思います。 参考にされたご提示のコードでは`getData`関数内にその処理がありますが、以下は行ごとにデータを取得するところで、A列のデータが空か空白文字列(" "のような文字が連続している)を見つけたらそこで処理を終了させるようにした改造例です。 ``` // 二次元配列をCSV形式のテキストデータに変換 var dataArray = []; for (var i = 0; i < values.length; i++) { // A列のカラムのデータが空か空白文字列であれば終了 var v = values[i][0]; if (typeof v == "string" && v.trim() == "") { break; } dataArray.push(values[i].join(",")); } ``` これを応用すれば特定のデータの時にスキップしたり加工したりすることもできるようになると思います。 尚、既に自己解決された案ですが、 > > 1.書き出すシートを「csv」シートに固定したい(解決済) > > 左から2番目のシートを書き出すことで自己解決しました。(gsコード内の変更点1と2) > > > `getSheetByName`を使うとシートを名前で指定することができるので、適時使ってみると良いと思います。 ``` var sheetActive = SpreadsheetApp.getActiveSpreadsheet();//変更点1 // var sheet = sheetActive.getSheets()[1];//変更点2 var sheet = sheetActive.getSheetByName("対象にしたいシート名"); ``` ブログなどの記事ですとどうしても関数やメソッドの詳細は載せきれないので、カスタマイズする際はGASのリファレンスを覗いてみることをお勧めします。見てみることでより細かくて便利な使い方が分かることもあります。 Google Apps Script - Spreadsheet Service