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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google スプレッドシート

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

Google Apps Script

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

Q&A

解決済

1回答

1784閲覧

複数フォルダ(共有フォルダ含む)配下の複数csvファイルの、スプレッドシートへの自動取込み方法について

somsom

総合スコア14

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2019/09/09 17:46

編集2019/09/09 17:56

実現したいこと

google drive の共有フォルダ含む複数フォルダ配下のすべてのcsvファイルを、定期的にスプレッドシートに取り込みたいと考えております。

基本的な処理は下記を参考にしましたが、事例は特定のフォルダ配下の特定のcsvのみ取り込むこととなっており、”共有フォルダ含む複数フォルダ配下のすべてのcsvファイルを取り込む”場合のスクリプトを教えて頂きたいです。

また、取込みが成功したファイルは削除することを検討しております。

参考ページ:https://qiita.com/YusukeKameyama/items/5ae840ec8d4382a215db

該当のソースコード

GAS

1//書き込む対象のSpread Sheetを定義 2var ss = SpreadsheetApp.getActiveSpreadsheet(); 3var sh = ss.getActiveSheet(); 4 5function import() { 6 7 // 対象のCSVファイルが置かれているフォルダ名、ファイル名を定義 8 var folderName = "csv"; 9 var fileName = "売上実績_AA_20190919.csv"; 10 var folders = DriveApp.getFoldersByName(folderName); 11 12 //フォルダとファイルの検索 13 while (folders.hasNext()) { 14 var folder = folders.next(); 15 if (folder.getName() == folderName) { 16 var files = DriveApp.getFilesByName(fileName); 17 while (files.hasNext()) { 18 var file = files.next(); 19 if (file.getName() == fileName) { 20 21 var data = file.getBlob().getDataAsString("UTF-8"); 22 23 var csv = Utilities.parseCsv(data); 24 25 var ALastRow = sh.getLastRow(); 26 27 //CSV書き込み 28 sh.getRange(ALastRow,1,csv.length,csv[0].length).setValues(csv); 29 return; 30 } 31 } 32 } 33 } 34}

補足情報

ファイル名は”売上実績_店舗コード_日付"という規約であり、共有フォルダ毎に店舗コードが異なります。売上実績というファイル名がつけば、すべて取込み対象としたいと考えております。

お手数ですが、`ご指導頂けますと有難く思います。
どうぞよろしくお願いいたします。

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

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

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

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

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

macaron_xxx

2019/09/10 00:11 編集

フォルダの階層は最大で何階層になりますか? GASでフォルダの階層をたどっていくと、最大実行時間を超えることが多々あります。 そのため、階層によってはアプローチを変える必要があります。
somsom

2019/09/10 03:07

ご質問ありがとうございます。 共有フォルダなので、共有先のフォルダ構成にもよりますが、極力マイドライブから2階層までにたどれるようにします。私の方からみると、下記のようなフォルダ構成になるかと思います。 マイドライブ ーcsv(フォルダ) 配下に★対象csvファイル ーAとの共有フォルダ  ーcsv(フォルダ) 配下に★対象csvファイル ーBとの共有フォルダ  ーcsv(フォルダ) 配下に★対象csvファイル ーCとの共有フォルダ  ーcsv(フォルダ) 配下に★対象csvファイル わかりづらくて申し訳ありません。 1つのcsvファイルの容量は小さいのですが、ファイル数は状況により0〜5くらいになる見込みです。 お手数ですが、ご指導のほどお願いいたします。
guest

回答1

0

ベストアンサー

提示のあったフォルダ構成でのみ動くようにはなっています。
CSVのヘッダ行は常に取り込まれたり、取り込み順は不同だったりは、無視しています。

下部に実行結果を載せているので参考にしてください。

GAS

1function q211038() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const csvFolderName = "csv"; 4 const fileName = /売上実績_.*_.*.csv/; 5 const rootFolderId = "***"; // ルートフォルダのID、マイドライブは"root" 6 7 const root = DriveApp.getFolderById(rootFolderId); 8 9 var rootFolders = root.getFolders(); 10 11 while(rootFolders.hasNext()) { 12 var folder = rootFolders.next(); 13 14 if(folder.getName() === csvFolderName) { 15 // 直下のファイル取り込みを実施 16 importCSV(folder); 17 } else { 18 // 直下のフォルダにcsvがあるか調べる 19 var csvFolder = folder.getFoldersByName(csvFolderName); 20 while(csvFolder.hasNext()) { 21 // 直下のファイル取り込みを実施 22 importCSV(csvFolder.next()); 23 } 24 } 25 } 26 27 function importCSV(folder) { 28 var files = folder.getFiles(); 29 while(files.hasNext()) { 30 var file = files.next(); 31 if (file.getName().match(fileName)) { 32 // 取り込み処理を実施 33 var data = file.getBlob().getDataAsString("UTF-8"); 34 var csv = Utilities.parseCsv(data); 35 var ALastRow = sheet.getLastRow(); 36 //CSV書き込み 37 sheet.getRange(ALastRow + 1,1,csv.length,csv[0].length).setValues(csv); 38 } 39 } 40 } 41}
/* テストフォルダ構成 */ [ルートフォルダ] --売上実績_0001_20191009.csv【取り込まない:取り込みフォルダ対象外】 --[CSV] ----売上実績_0001_20191009.csv【取り込む】 --[A] ----[CSV] ------売上実績_0002_20191009.csv【取り込む】 ------売上実績_0002_20191010.csv【取り込む】 ------売上XXX_0002_20191009.csv【取り込まない:取り込みファイル名対象外】 ----[NOCSV] ------売上実績_0002_20191009.csv【取り込まない:取り込みフォルダ対象外】 --[B] ----売上実績_0003_20191009.csv【取り込まない:取り込みフォルダ対象外】 ----[CSV] ------売上実績_0003_20191009.csv【取り込む】 --[C] ----[CSV] ------売上実績_0004_20191009.csv【取り込む】

投稿2019/09/10 04:40

macaron_xxx

総合スコア3191

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

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

somsom

2019/09/11 14:55

ご回答ありがとうございます!こちらで試したところ、問題なく取込みができました。 当初、共有フォルダでは取り込めない事象が発生しましたが、フォルダのステータスが「共有アイテム」のままだったので、共有アイテムをマイドライブに追加することで、共有フォルダとして、配下のcsv ファイルが取り込めるようになりました。迅速に対応していただきありがとうございました。
macaron_xxx

2019/09/12 00:16 編集

>フォルダのステータスが「共有アイテム」のままだったので これは直接的な原因というよりも、マイドライブにないと、全てフォルダidを指定して取り込まないといけない、ということです。 CSVのフォルダidが決まっている(流動的に増えたりしない)のであれば、配列にフォルダidをすべて入れて、ループで回したほうが処理は早いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問