特定のCSVを定期的にGoogle Spreadsheetへ自動で更新する方法【GAS】

表題の通り、とあるCSVGoogle Spreadsheetへ書き出す必要があったですが、手動ではかなり面倒・・・。よって自動で何かできないか調査して、結果できたものを共有します。

前提

  • CSVはオンラインでアクセスできるURL
  • CSVフォーマット
    • 区切り記号はカンマ(,)
    • 各項目がダブルクオーテーションにて囲まれている
    • 項目内に改行あり ※これ重要

コード

function auto_csv(){

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('test');

    var url = "https://www.test.com/test.csv";
    var blob = UrlFetchApp.fetch(url).getBlob();

    // データ取得
    var data = blob.getDataAsString();
    
    // 2次元配列に転換
    var ary = CSV.parse2(data);
    //var ary = Utilities.parseCsv(data); // これが使えなかった・・

    // シートに反映
    sh.getRange(1,1,ary.length,ary[0].length).setValues(ary); 

}

// csv parse
// 参考:javascriptでCSVのparser/stringifierを書いてみた - Qiita
// https://qiita.com/weal/items/5aa94235c40d60ef2f0c
var CSV = {};
CSV.parse2 = function(str) {
    var i, c, r, q, l, m, v, j, len=str.length, rows = [], row = [];
    m = (l = str.indexOf('\r\n')<0 ? str.indexOf('\r')<0 ? '\n' : '\r' : '\r\n').length; //改行記号を決定
    for(i=0,c=r=-1; i<len; i++) {
        if (str.charAt(i) === '"') { //quoted
            for(j=0,q=i+1; q<len; j++,q++) { //閉quotを探す
                q = (q=str.indexOf('"',q)) < 0 ? len+1 : q; //quotの位置、無いなら末尾まで
                if (str.charAt(++q) !== '"') {break;}       //""なら継続
            }
            row.push((v=str.substring(i+1,(i=q)-1),j) ? v.replace(/""/g,'"') : v);
        } else { //not quoted
            if (c<i) {c=str.indexOf(',',i);c=c<0?len:c;} //直近のカンマ位置と
            if (r<i) {r=str.indexOf(l,i);r=r<0?len:r;}   //直近の改行位置を調べ
            row.push(str.substring(i,(i=c<r?c:r)));      //そこまでを値とする
        }
        if (i === r || l === (m>1?str.substr(i,m):str.charAt(i))) {rows.push(row);row=[];i+=m-1;}
    }
    str.charAt(i-1) === ',' && row.push(''); //,で終わる
    row.length && rows.push(row);
    str.substr(i-1,m) === l && rows.push([]); //最後の改行を無視する場合はコメントアウト
    return rows;
};

解説・所感

ネットで調査していると「Utilities.parseCsv」を使ったものがほとんどだったのですが、そうすると項目内にある改行に対応できなかったです。(結構ハマりました・・・) よってなにか無いと思って調べていたところ以下のオリジナルのparserと出会い、試しにやってみるとできました!
javascriptCSVのparser/stringifierを書いてみた - Qiita
https://qiita.com/weal/items/5aa94235c40d60ef2f0c

感謝