GASでスプレッドシートからCSVを出力する方法【初心者向け解説】

まいまい お仕事

こんにちは! 前回のブログでは、Google Apps Script(GAS)を使ってGoogleスプレッドシートに「オリジナルメニューを追加する方法」を紹介しました。

今回はその続編として、スプレッドシートのデータをCSVとして出力する方法 をご紹介します。業務でのデータ整理や、外部システムへの取り込みなど、CSV出力は実際の現場でもよく使う便利機能です。

今回やること

スプレッドシートのデータを取得
条件ごとに「winners」「losers」に分ける
CSV形式に変換
ダウンロードできるようにする

最終的には、メニューから「CSV出力」をクリックすると、自動でCSVファイルが作成されてダウンロードできるようになります。
※ヘッダーが1行目の設定ではありませんので実装の際はご注意ください

まずはメニューにCSV出力機能を追加する

前回と同じように、メニューを追加してそこから関数を呼び出せるようにします。


function onOpen() {
 const ui = SpreadsheetApp.getUi();
 const menu = ui.createMenu("CSV出力");

 menu
  .addItem("勝者データを出力", "csvDownloadWinners")
  .addItem("敗者データを出力", "csvDownloadLosers")
  .addToUi();
}

これで、スプレッドシートを開くとメニューに「CSV出力」が追加され、クリックすると処理が動くようになります。
※ここがよくわからない人は前回のブログ「GASでスプレッドシートに階層メニューを追加する方法」を見てみてください

CSV出力のメイン処理


function showDownloadDialog(type) {
 var html = HtmlService.createTemplateFromFile("dialog");
 html.type = type; // "winners" or "losers"
 SpreadsheetApp.getUi().showModalDialog(html.evaluate(), "CSVをダウンロード");
}

function csvDownloadWinners() {
 showDownloadDialog("winners");
}

function csvDownloadLosers() {
 showDownloadDialog("losers");
}
ここで「勝者」「敗者」を選択できるようにし、ダイアログを表示します。

CSVデータを生成する部分


function getData(type) {
  const sheet = SpreadsheetApp.getActiveSheet();
  const data = sheet.getDataRange().getDisplayValues();

  // 2行目をヘッダーに利用
  const header = data[1];
  const result = [header];

  // 3行目以降をデータとして取得
  for (let i = 2; i < data.length; i++) {
    const row = data[i];
    const isWinner = row[19] && row[19].toString().trim() !== "";
    if ((type === "winners" && isWinner) ||
        (type === "losers" && !isWinner)) {
      result.push(row);
    }
  }

  // CSV形式に変換
  const csvString = result
    .map(r => r.map(field =>
      `"${(field ?? "").toString().replace(/"/g, '""')}"`  
    ).join(","))
    .join("\r\n");

  // Excelで文字化け防止するためBOMを追加
  const bom = "\uFEFF";
  return bom + csvString;
}

ここでは 「勝者」「敗者」判定は「20列目(インデックス19)」のセルに値があるかどうかで判断しています。
自分のシートに合わせて条件を調整してください。

ファイル名を動的に付ける

保存時に「いつのデータか」が分かるように、タイムスタンプ付きのファイル名をつけます。


function getFileName(type) {
  const now = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyyMMdd_HHmmss");
  if (type === "winners") {
    return `winners_${now}.csv`;
  } else {
    return `losers_${now}.csv`;
  }
}

ダウンロード用HTMLファイル

最後に、HTMLを使って実際にダウンロードさせる仕組みを作ります。
dialog.html という名前でプロジェクトに追加してください。


<!DOCTYPE html>
<html>
 <head>
  <base target="_top">
  <script>
   window.onload = function() {
    const type = "<?= type ?>";  // winners or losers
    google.script.run
     .withSuccessHandler(function(content) {
      google.script.run.withSuccessHandler(function(filename) {
       const blob = new Blob([content], { type: "text/csv" });
       const link = document.createElement('a');
       link.download = filename;
       link.href = URL.createObjectURL(blob);
       link.click();
       google.script.host.close();
      }).getFileName(type);
     })
    .getData(type);
   };
  </script>
 </head>
 <body>
  CSVを生成しています...
 </body>
</html>

これで、CSVファイルが自動的にダウンロードされるようになります。

関数ごとのちょこっとポイント解説

showDownloadDialog(type)
→ CSVダウンロード用のモーダルを呼び出す関数。type が “winners” か “losers” で切り替わります。

csvDownloadWinners() / csvDownloadLosers()
→ 「勝者」「敗者」用にそれぞれ呼び出せるショートカット関数。メニューから実行させると便利。

getData(type)
→ スプレッドシートのデータを読み込み、条件に合う行だけを抽出。Excel対応のBOM付きUTF-8でCSVを生成しているので文字化けしにくいのがポイント。

getFileName(type)
→ ダウンロードするファイル名を、実行時の日時付きで自動生成。winners_20250903_153000.csv のようにユニークになります。

HTML部分
→ GASで生成したCSVを一時的にBlob化し、自動でダウンロード開始。処理が終わればダイアログも自動で閉じます。

まとめ

GASでスプレッドシートに「CSV出力」メニューを追加できる

getData()でデータをCSV形式に変換し、ダイアログからダウンロードできる

ファイル名にタイムスタンプをつけると便利

CSV出力機能は、一度仕組みを作ってしまえば日常業務がとてもスムーズになります。自分だけでなくチーム全体の効率化にもつながるので、ぜひ実践してみてください。
ちょっとした工夫で仕事がぐっと楽になるのが、GASの大きな魅力ですね🌟