🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

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

Google Apps Script

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

Q&A

解決済

1回答

5508閲覧

GASで複数ファイル(csv)をスプレッドシートへ取り込みしたい

yskt

総合スコア16

CSV

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/03/09 12:40

前提・実現したいこと

GoogleDriveフォルダ内に格納された複数のcsvをスプレッドシートに取り込みたいです。
-csvの格納フォルダは1つ
-命名規則は「yymmdd.csv」

csvの格納フォルダとスプレッドシートは同じ階層にあります。
-取込先スプレッドシート
-CSV格納フォルダ
├ yymmdd.csv
├ yymmdd.csv
├ yymmdd.csv

別の方のソースを参考にした結果、フォルダ内の全件を順不同で取り込むことはできましたが
追加で下記に記載したことを実現させるための方法を教えていただきたいです。

・取込はファイル名の日付が昇順になる順番で取り込みたい
・取り込んだファイルは別フォルダ(取り込み済み専用)に格納したい

該当のソースコード

Google

1function importData() { 2 3// 対象フォルダを指定 4 var ss = SpreadsheetApp.getActiveSpreadsheet(); 5 var sheet = ss.getSheetByName("データ読込"); 6 var folder = DriveApp.getFolderById('*****************'); //フォルダパスを指定 7 var val = "2"; 8 9 var files = folder.getFiles(); 10 while(files.hasNext()) { 11 var file = files.next(); 12 // 取込処理 13 var data = file.getBlob().getDataAsString("SJIS"); 14 var csv = Utilities.parseCsv(data); 15 var setData = csv.filter(function(row) { 16 return row[0] == val ; 17 }); 18 var ALastRow = sheet.getLastRow(); 19 // CSV書込 20 sheet.getRange(ALastRow + 1,1,setData.length, setData[0].length).setValues(setData); 21 } 22 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

gasはほとんど知らなかったですが勉強のつもりで調べてやってみました。

まずファイル名順で処理するには、リストに入れてソートしてから処理すればいいんじゃないでしょうか。

let files2=[] while(files.hasNext()) { files2.push(files.next()); } files2.sort(function(a, b) {if(a.getName()>b.getName()){return 1 } else {return -1} })

次にファイルの移動は、ファイルのメソッドにmoveToってのがあるので
これを使うと出来ました。

実行するために承認とか何度も出てビックリしました。

投稿2021/03/09 13:49

xail2222

総合スコア1508

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

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

yskt

2021/03/10 03:55

ありがとうございます!! ソート処理についてですが、下記の位置に入れてみたのですがうまく動かず・・ 何か抜けているところなどありますでしょうか? let files2=[] while(files.hasNext()) { files2.push(files.next()); } files2.sort(function(a, b) {if(a.getName()>b.getName()){return 1 } else {return -1} }) ↑追加------- var files = folder.getFiles(); while(files.hasNext()) { var file = files.next(); // 取込処理 var data = file.getBlob().getDataAsString("SJIS"); var csv = Utilities.parseCsv(data); var setData = csv.filter(function(row) { return row[0] == val ; }); var ALastRow = sheet.getLastRow(); // CSV書込 sheet.getRange(ALastRow + 1,1,setData.length, setData[0].length).setValues(setData); }
xail2222

2021/03/10 04:09

ソート処理は var files = folder.getFiles(); の後に入れて下さい あとループをfiles2に対して実行するように変更して下さい
yskt

2021/03/10 04:21

ループをfiles2に対して実行すると下記のエラーが発生してしまいました・・! 「TypeError: files2.hasNext is not a function」
xail2222

2021/03/10 04:38 編集

while(files.hasNext()) { var file = files.next(); を files2.forEach(function(file){ に変更して下さい あと最後に )
xail2222

2021/03/10 05:10

forEachよりfor-ofの方がよさそうですかね
yskt

2021/03/10 07:15

ありがとうございます!無事にできました!!! 全くの初心者のため、後学のためにお伺いです。 お手すきで見ていただけますと有難いです・・! ・whileだと配列はループできないのでしょうか? ・forEachとfor-ofだと具体的に何か違いはありますでしょうか?(今回はforEachで書いていますがfor-ofにすることでなにかメリットがあったりするのかなと) ・filesの値をfiles2という配列に格納後にsortしていますが、files自体の中身をsortすることってできないのでしょうか?(=配列に格納しないとsortできないのかな?という質問です)
xail2222

2021/03/10 12:46 編集

・whileだと配列はループできないのでしょうか? [whileについて] https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/while [配列について] https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array 配列にはlengthプロパティがあるので、これとループカウンタ変数を使用して 以下のように書くことができます。 var i=0; while (i < files2.lengh) { var file = files2[i]; // 略 i++; } ループの度にiが1ずつ加算されて、i < files2.lengh が成立する間ループするということですね。 ・forEachとfor-ofの違い [forEach] https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach "例外を発生する以外の方法で、forEach() ループを止めることはできません。ループ中に中断する必要がある場合、forEach() メソッドは適切な方法ではありません。" とのこと for-ofは、breakで中断出来る所が違うということですね。 後は、for-ofの方が書き方が単純という事でしょうか。 ・getfilesの戻り値、filesでソートできない理由 [getFilesについて] https://developers.google.com/apps-script/reference/drive/drive-app#getFiles() まず、ここに記載されているようにgetFilesには引数がありませんし ソートされた状態で取得する事は出来ないと思います。 またgetFilesで取得できるのはFileIteratorというオブジェクトと記載されています。 そしてFileIteratorのページを見ると、プロパティはなく、メソッドは getContinuationToken() hasNext() next() の3つのようです。ソートの機能は無いと思います。 あと配列のソートですが、私の例示ではa=bの時に0を返してないので files2.sort(function(a, b) {return a.getName().localeCompare(b.getName())}) こちらの方がいいかもしれないですね。
yskt

2021/03/16 05:00

xail2222さん ご丁寧な回答ありがとうございます! 読みながら理解を深めたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問