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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Q&A

解決済

1回答

2490閲覧

[GAS]googledrive内のCSVファイルをスプレッドシートにうまく出力できない

noah_is_over

総合スコア5

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2020/10/18 02:54

前提・実現したいこと

google driveに保存している30件ほどのcsvデータをグラフ化するため、スプレッドシートへ出力しています。
しかし、2行目からのデータが2列目以降にしか出力されず、それが解決できません。今のところmoveToでずれた部分を無理矢理修正していますがどうにも無駄に感じます。
改善の方法をご教示願います。

#スプレッドシートへの出力

上の画像のように3行目以降のデータは2列目から出力されています。
なお、元のデータはカンマ区切りのCSVファイルで、1行のデータで1つのcsvファイルです。

#該当ソースコード

GAS

1function test_myFunction() { 2 var folder_id = ""; 3 var folder = DriveApp.getFolderById(folder_id); 4 var files = folder.getFiles();  5 var list = []; //走査のためのリスト 6 var rowIndex = 2; 7 var colIndex = 1; 8 9 //出力先シートの特定 10 var sheetName = ""; 11 var ss = SpreadsheetApp.getActive(); 12 var sheet = ss.getSheetByName(sheetName); 13 14 //イテレータを配列に 15 while(files.hasNext()) { 16 var buff = files.next(); 17 list.push([buff.getName(),buff.getBlob().getDataAsString()]); 18 var values = Utilities.parseCsv(list); 19 }; 20 Logger.log(values); 21 var range = sheet.getRange(rowIndex, colIndex, values.length, values[0].length); 22 23 range.setValues(values); 24}

rangeの部分の記述が間違っているのか等いろいろと書き替えましたがうまくいっていません。
GASについてもまだ不勉強ですのでもっと効率のいい記述などもありましたら重ねてご教示頂けますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードの内容が、CSVの中身をそのまま取り込むではなく、CSVファイル名を先頭にもってきて、ファイルごとに1行ずつ書き出す処理のようなので、Utilities.parseCsvをそのまま使うのは良くないです。

たぶん、listにpushした二次元配列の配列間の, を区切りと判断して 2行目以降の先頭に空白が入ってしまっているんじゃないでしょうか。

Utilities.parseCsvをいかすなら、 listに配列をpushして2次元配列をつくるのではなく、CSVデータっぽい文字列を作成して、最後にまとめて Utilities.parseCsv で2次元配列化、書き込み処理することで、すっきりした流れになるかと思います。

function test_myFunction() { var folder_id = ""; var folder = DriveApp.getFolderById(folder_id); var files = folder.getFiles();   var list = ""; //走査のためのリスト var rowIndex = 2; var colIndex = 1; //出力先シートの特定 var sheetName = ""; var ss = SpreadsheetApp.getActive(); var sheet = ss.getSheetByName(sheetName); //イテレータを文字列に while(files.hasNext()) { var buff = files.next(); console.log(buff.getName()); list += buff.getName() +","+ buff.getBlob().getDataAsString();//Listに文字列を足していく }; console.log(list); var values = Utilities.parseCsv(list); //最後にまとめて二次元配列化 var range = sheet.getRange(rowIndex, colIndex, values.length, values[0].length); range.setValues(values); }

投稿2020/10/19 00:17

sawa

総合スコア3002

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

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

noah_is_over

2020/10/19 01:12

ご回答ありがとうございます。無事解決することができました。 以前のコードではそもそもwhile文内でparseCsvしていたので非常に効率が悪かったのですが、その部分の改善にもつながりました。 先頭に空白が入ってしまっている理由がわからなかったのでお聞きできて非常に助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問