Google App Scriptでスプレットシートを印刷できなかった…
業務効率化の目的でGoogle App Script(以下GAS)をつかってシートを自動印刷する機能を実装しようとしました。しかし、GASにはスプレットシートを印刷するための機能が備わっていませんでした。代替手段としてPDF出力してGoogle Driveに保存することにしました。
シートをPDF出力
こちらのサイトを参考にしてPDF出力の処理を書きました。
PDF出力.gs
// -メイン処理部分は省略-
function CreatePdf(fileName, sheetId, folderId){
//PDFを作成するためのベースとなるURL
let baseUrl = "https://docs.google.com/spreadsheets/d/"
+ "スプレッドシートのユニークID"
+ "/export?gid="
+ sheetId;
//PDFのオプションを指定
let pdfOptions = "&exportFormat=pdf&format=pdf"
+ "&size=A4" //用紙サイズ (A4)
+ "&portrait=true" //用紙の向き true: 縦向き / false: 横向き
+ "&fitw=true" //ページ幅を用紙にフィットさせるか true: フィットさせる / false: 原寸大
+ "&top_margin=0.50" //上の余白
+ "&right_margin=0.50" //右の余白
+ "&bottom_margin=0.50" //下の余白
+ "&left_margin=0.50" //左の余白
+ "&horizontal_alignment=CENTER" //水平方向の位置
+ "&vertical_alignment=TOP" //垂直方向の位置
+ "&printtitle=false" //スプレッドシート名の表示有無
+ "&sheetnames=false" //シート名の表示有無
+ "&gridlines=false" //グリッドラインの表示有無
+ "&fzr=false" //固定行の表示有無
+ "&fzc=false" //固定列の表示有無
+ "&range=A1%3AL70"; //セル範囲を指定したりもできる
//PDFを作成するためのURL
let url = baseUrl + pdfOptions;
//アクセストークンを取得する
let token = ScriptApp.getOAuthToken();
//headersにアクセストークンを格納する
let options = {
headers: {
'Authorization': 'Bearer ' + token
}
};
//PDFを作成する
let blob = UrlFetchApp.fetch(url, options).getBlob().setName(fileName + '.pdf');
//PDFの保存先フォルダー
//フォルダーIDは引数のfolderIdを使用します
let folder = DriveApp.getFolderById(folderId);
//PDFを指定したフォルダに保存する
folder.createFile(blob);
}
ダウンロード用のモーダルを出すこともできる
今回私の作ったコードでは実装しませんでしたが、PDF出力が終わった後に、出力ファイルのID用いて画面に自作のダウンロードモーダルを表示することもできます。こうすることでスプレットシート上から移動することなく出力からダウンロードまでの処理ができるようになります。
モーダルを出す方法
Google Drive上のファイルのダウンロードリンクを作る方法
まとめ
当初予定していた機能で実装することできませんでしたが、代替手段を用いて近い機能で実装することに成功しました。ライブラリやコードの機能をそのまま使うだけでは自分の思い描いた通りの機能が作れるのは稀で(よくできた言語や機能が充実したライブラリならできる事もある)、大抵何かしら工夫をすることで実装することが多いです。私も仕事でのプログラミング経験はまだ浅いので今回の件はいい練習になりました。