1番最近フォルダにDLされたCSVを、スプレッドシートにsetvaluesするGAS

2,270 views
Skip to first unread message

GSBPS

unread,
Mar 10, 2018, 2:35:26 AM3/10/18
to Google Apps API Japan
いつもお世話になっています。

▼実現したいこと
特定のフォルダ(idまたはURLがわかっているフォルダ)に、1番最近格納されたcsv(ファイル名はアンコントローラブル前提)を、特定のスプレッドシート(idまたはURLがわかっているスプレッドシート)にsetvaluesするGASを作成したいです。スプレッドシートのContainer-Bound Scriptsを想定しています。

▼用途
特定のフォルダに毎日csvをDLする。最新のcsvデータを自動でSpreadsheetに反映させたい。

▼わかっていること
ファイル名がわかっているcsvをスプレッドシートにsetvaluesする方法は、以下の方法で実現できることはわかっています。
これを応用し「ファイル名はわかっていないが、1番最近フォルダにDLされたcsv」を対象としたGASにしたく思っています。

ご存知の方がいましたらお助けいただけますと幸いです。
何卒宜しくお願い致します。

なかひこ

unread,
Apr 4, 2018, 5:57:44 AM4/4/18
to Google Apps API Japan
初めまして,中山 貴幸と申します.

以下のような実装だと実現可能かと思われます.


var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
var folder_id = "XXXXXXXXXXXXXXXXXXXXXXXX";

//最新のCSVファイルをSheetへ展開する
function import(){
 
var file = getNewestFile(folder_id);
  csv2sheet
(file);
}

//idからフォルダ内で一番新しいファイルを取得
function getNewestFile(id){
 
var files = getFilesArray(id);
  files
= files.sort(SortfileByDate);
 
return files[0];
}

//idからフォルダ内のファイルを配列で取得
function getFilesArray(id){
 
var files = [];
 
var files_itr = DriveApp.getFolderById(id).getFiles();
 
while (files_itr.hasNext()) {
   
var file = files_itr.next();
    files
.push(file);
 
}
 
return files;
}

//ファイルを新しい順に並び替える
function SortfileByDate(f1, f2){
 
return (f1.getLastUpdated() < f2.getLastUpdated()) ? 1 : -1;
}

//CSVをシートに書き込む:参照しているQIITAより抜粋
function csv2sheet(file){
 
var data = file.getBlob().getDataAsString("Shift_JIS");
 
var csv = Utilities.parseCsv(data);
  sh
.getRange(1,1,csv.length,csv[0].length).setValues(csv);
}


しかし,注意されたいこととして,
  • フォルダ内の最新ファイルがCSV以外である場合`csv2sheet `がエラーになる.
  • `SortfileByDate`にて「最終更新日時」によってソートしている.(「作成日時」をもとにソートする場合は少し変更する必要がある)
  • importのfunctionを呼び出す手段を用意する必要がある(時間主導のトリガーとかを用意する)
がありますので,その点だけお気をつけください.

以上です.何か不明点があれば遠慮なくどうぞ!



2018年3月10日土曜日 16時35分26秒 UTC+9 GSBPS:

hikochang

unread,
Apr 5, 2018, 11:54:26 AM4/5/18
to Google Apps API Japan
私も少し割り込んでよいでしょうか?
なかひこ さんの注意事項の一つが以下で解消しませんか?

指定されたIDのフォルダからCSVファイルを探すのは以下のように親フォルダIDとMIMEタイプを指定してsearchFilesを使うのはどうでしょうか?

function getFilesArray(id){
  var files = [];
  var files_itr = DriveApp.searchFiles(  Utilities.formatString("'%s' in parents and mimeType = '%s'", folderID, MimeType.CSV ) );
  while (files_itr.hasNext()) {
    var file = files_itr.next();
    files.push(file);
  }
  return files;
}

うまくいかない場合は以下で正しく取得できることを確認してください。
searchFiles(" ’XXXXXXXXXXX' in parents and mimeType = 'text/csv' ");

割り込んだ割に、動作確認はしていないし、ドキュメントを読み逃しているかもしれません。
ドキュメントへのリンクも貼っておくので参考にしてください。


searchFilesに渡すパラメータを頑張って生成することげいろいろなところに散らばっている特定の条件のファイルを一気に処理することができます。最近のお気に入りです。
例えば特定のフォルダ以下すべての階層にふくまれるファイルを一つのFileIteratorとして取得する方法なんかも見つけちゃいました。

2018年4月4日水曜日 18時57分44秒 UTC+9 なかひこ:

GSBPS

unread,
Apr 5, 2018, 6:27:53 PM4/5/18
to Google Apps API Japan
なかひこ様大変丁寧にお教えいただき誠にありがとうございました。
こちらで実装を進めて行きたいと思います。またわからないことがありましたら是非ご相談させてください!

引き続き宜しくお願い致します。


2018年4月4日水曜日 18時57分44秒 UTC+9 なかひこ:

GSBPS

unread,
Apr 5, 2018, 6:31:30 PM4/5/18
to Google Apps API Japan
hikochang様

ご返信いただきありがとうございます。
大変有用なご指摘ありがとうございました。こちらも実装に反映したいと思います。

引き続き宜しくお願い致します!

2018年4月6日金曜日 0時54分26秒 UTC+9 hikochang:
Reply all
Reply to author
Forward
0 new messages