0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【GAS】GoogleスプレッドシートでシートごとにPDFダウンロードする方法

0
Posted at

概要

Googleスプレッドシートで毎月月毎のシートをPDF出力していて、PDFのファイル名を最終的に タイトル_yyyy年MM月_サブタイトル.pdf としたいので、下記のようにして管理していました。

  • ファイル名:タイトル_yyyy年MM月_サブタイトル
  • シート名:yyyy-MM

例えばシート名が 2025-10 だとすると、ダウンロードしたPDFのファイル名は タイトル_yyyy年MM月_サブタイトル - 2025-10.pdf となります。ここからyyyyとMMにそれぞれ2025と10を入れて末尾の - 2025-10を消す、という作業が毎月発生するので地味に面倒でした。

というわけで、もうダウンロードした時点で完成形のファイル名にしたろ!と思い、GASでなんとかすることにしました。

この記事のゴール

まず、こんな感じでカスタムメニューにPDFダウンロードメニューを設置します。

スクリーンショット 2025-10-27 143148.png

で、これを押したらモーダルダイアログで実際にダウンロードする際のファイル名とダウンロードボタンが出るようにします。

スクリーンショット 2025-10-27 143258.png

この「ダウンロードする」ボタンを押せば、表示したファイル名でPDFダウンロードできるようにするのがこの記事のゴールです。

手順

スプレッドシートファイル名を変更する

ファイル名を タイトル_yearMonth_サブタイトル に変更します。

置換する方法が変わるだけなので、正直そのままでも良いです。ただなんとなくGAS側で yyyy年MM月 を生成した方が見やすいかなと思って yearMonth に変えています。

GAS(Apps Script)を開く

まず、拡張機能 > Apps Script でGASの画面を開きます。

必要なのは下記の2つです。

  • コード.gs
  • dialog.html

スクリーンショット 2025-10-27 144922.png

コード.gs

/*
 カスタムメニューの追加
 -> スプレッドシート自体にカスタムメニューを追加
 -> カスタムメニュー内に「PDFダウンロード」メニューを追加
*/
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  const menu = ui.createMenu('カスタム');
  menu.addItem('PDFダウンロード', 'showDownloadModal');
  menu.addToUi();
}

/*
 PDFダウンロードメニューを押したときの動作
 ->「PDF download」というモーダルダイアログを出す
 -> モーダルの中身は後述するdialog.html
*/
function showDownloadModal() {
  const html = HtmlService.createTemplateFromFile('dialog').evaluate();
  SpreadsheetApp.getUi().showModalDialog(html, 'PDF download');
}

/*
 ダウンロードするURLを生成する
*/
function createDownloadUrl() {
  // スプレッドシート
  const sheet = SpreadsheetApp.getActiveSpreadsheet();
  // 現在のシート
  const currentSheet = sheet.getActiveSheet();

  const url = `https://docs.google.com/spreadsheets/d/${sheet.getId()}/export?gid=${currentSheet.getSheetId()}&exportFormat=pdf&format=pdf`;
  const token = ScriptApp.getOAuthToken();
  const blob = UrlFetchApp.fetch(url, {
    headers: { 'Authorization': 'Bearer ' + token }
  }).getBlob();

  // Base64でエンコードして渡します
  return 'data:application/pdf;base64,' + Utilities.base64Encode(blob.getBytes());
}

/*
 ファイル名を生成する
 -> スプレッドシートのファイル名、現在のシート名を取得
 -> シート名から年と月を抽出し、ファイル名のyearMonthを年月で置換
*/
function getFileName() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet();
  const docName = sheet.getName();
  const sheetName = sheet.getSheetName();
  const yearMonth = sheetName.split('-');
  const year = yearMonth[0];
  const month = yearMonth[1];

  return docName.replace('yearMonth', `${year}${month}月`) + '.pdf';
}

参考のブログをベースにしつつ独自仕様にカスタマイズしたので公式のリファレンスが便利でした。

dialog.html

モーダルダイアログの中身です。

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <div id="filename"></div>
    <button type="button" onclick="downloadPdf()">ダウンロードする</button>
  </body>
  <script>
   // ダイアログを出したときにファイル名を取得して表示
    window.onload = function() {
      setFileName();
    }
    // ファイル名を取得してセット
    function setFileName() {
      const fileName = <?= getFileName(); ?>;
      document.getElementById('filename').textContent = fileName;
    }
    // ダウンロード処理
    function downloadPdf() {
      const objUrl = <?= createDownloadUrl(); ?>;
      const fileName = <?= getFileName(); ?>;
      const link = document.createElement('a');
      document.body.appendChild(link);
      link.download = fileName;
      link.href = objUrl;
      link.click();
      google.script.host.close();
    }
  </script>
</html>

初回のみ承認が必要

初回実行時に承認を求めるポップアップが出てくるので自分のアカウントでログインして承認します。こちらの記事が画像付きでわかりやすいです。

ちなみにこの記事にも書いてありますが、初回実行時は承認プロセスが走るだけで実際にPDFダウンロードは実行されないので承認後に再度実行してください。

これで最初から完成形のファイル名でダウンロードされるようになりました。めでたしめでたし。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?