Google SpreadSheetからCSVファイルを出力するスクリプト


Covid19の陽性者数と移動平均線のグラフを見たくてGoogle SpreadSheetにデータを転記してグラフを描かせた。
一人で見るのももったいないので、グラフとデータのURLを連日貼り付けていたら、要望がきてグラフが増えた。
そうするとちょっと面倒になるので、新しいデータを記入したらグラフを更新してweb pageを更新するようにしたくなった。
そこでSpreadSheetのデータをCSVファイルに書き出して、web server側でCSVファイルを取り込んでおいて、グラフはCSVファイルをみて描画するようにしてみた。(やったのは1枚だけ)

この作業中のCSVファイルを作る部分は以下のページ
スプレッドシートのデータをGASを使って1クリックでCSVに吐き出すものを作る。
を参考に、いくつかの修正を加えたのが下のGoogle App Script(GAS)のコード。

修正点:
・すでにCSVファイルがある場合は、上書きする(同名で作成すると別IDの別ファイルができる)
・左端の列が空欄になったらデータの書き出しをやめる(*1)
・出力するCSVファイル用の関数を用意した

*1: データとグラフのシートを参照するCSVファイル出力用のデータのみのシート、これから出力するのだが、式が入っていると空欄でもデータがあると認識されてカンマだけの行ができる

var folderId = '#################################'; //念の為伏せ字
var fileNamePositives = 'Covid19-Positives.csv'
var fileNameAdmissions = 'Covid19-Admissions.csv'
var fileNameTests = 'Covid-19-Tests.csv'

function createCsvPositives(){
  var fileName = fileNamePositives;
  createCsv(fileName);
}

function createCsvAdmissions(){
  var fileName = fileNameAdmissions;
  createCsv(fileName);
}

function createCsvTests(){
  var fileName = fileNameTests;
  createCsv(fileName);
}

function createCsv(fileName) {
  var csvData = loadData();
  writeDrive(csvData, fileName);
}

function loadData() {
  var data = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  var csv = '';
  for(var i = 0; i < data.length; i++) {
    if(data[i][0] == "") {
      break;
    }
    csv += data[i].join(',') + "\r\n";
  }
  Logger.log(csv)

  return csv;
}

function writeDrive(csv, fileName) {
  var drive = DriveApp.getFolderById(folderId); 
  var contentType = 'text/csv';
  var charset = 'utf-8';
  
  var files = drive.getFilesByName(fileName);
  if(files.hasNext()) {
    var csvFile = files.next();
    csvFile.setContent(csv);
  }else{
    var blob = Utilities.newBlob('', contentType, fileName).setDataFromString(csv, charset);
    drive.createFile(blob);
  }
}

サーバー側でCSVファイルを取得するには、以下の形式のURLでアクセスする。
https://drive.google.com/uc?export=download&id=[FILE_ID]
(どこを参考にしたのか忘れた^^;)

こうしてサーバ側に持ってきたCSVファイルをJavascriptで読み込んで、Chart.jsに渡して描画させることができた。

ここまで書いたが、Google SpreadSheetで作ったグラフをweb pageに埋め込めることがわかったので、手間かけて用意したものは使わずにGoogle SpreadSheetのグラフを埋め込んで片付けてしまった。
>> 私家版:沖縄県Covid19関連グラフ