【GAS入門】スプレッドシートをPDFとして出力する方法〜複数シート対応&範囲指定オプション活用法〜
GASでスプレッドシートをPDFとして出力する方法
よし、まずは基本的なことからやっていこう。
スクリプト
次のスクリプトを見てくれ。
function exportSheetAsPDF() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getActiveSheet();
const sheetId = sheet.getSheetId();
const url = 'https://docs.google.com/spreadsheets/d/' + spreadsheet.getId() + '/export?';
const exportOptions = {
format: 'pdf',
gid: sheetId,
size: 'A4',
portrait: true,
fitw: true,
sheetnames: false,
};
const queryString = Object.keys(exportOptions)
.map(key => key + '=' + exportOptions[key])
.join('&');
const fullUrl = url + queryString;
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(fullUrl, {
headers: {
Authorization: 'Bearer ' + token,
},
});
const blob = response.getBlob().setName(sheet.getName() + '.pdf');
DriveApp.createFile(blob);
}
このスクリプトは、現在のスプレッドシートからアクティブなシートをPDFで出力するためのURLを作成してGoogleドライブのマイドライブ直下に保存するコードだ。
SpreadsheetApp.getActiveSpreadsheet()でスプレッドシートを取得し、sheet.getSheetId()でシートのIDを取得。
この情報でPDFのURLを構築するんだ。
そのURLをUrlFetchApp.fetch() でPDFデータを取得して、DriveApp.createFile() でGoogleドライブに保存しているぞ。
実践
さて、このコードを実際に実行するとどうなる??
試しにやってみるぞ。たとえば、このようなスプレッドシートがあってこのシート(名前はシート1)がアクティブになってるとする。

その場合、

ほら、シート名の「シート1」をファイル名としてGoogle Driveのマイドライブ直下にファイルを保存できているぞ。
GASでスプレッドシートの複数シートをPDFとして出力する方法
次に、複数のシートを一つのPDFにまとめる方法を見てみよう。
スクリプト
function exportMultipleSheetsAsPDF() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const url = 'https://docs.google.com/spreadsheets/d/' + spreadsheet.getId() + '/export?';
const exportOptions = {
format: 'pdf',
size: 'A4',
portrait: true,
fitw: true,
sheetnames: false,
printtitle: false,
};
const queryString = Object.keys(exportOptions)
.map(key => key + '=' + exportOptions[key])
.join('&');
const fullUrl = url + queryString;
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(fullUrl, {
headers: {
Authorization: 'Bearer ' + token,
},
});
const blob = response.getBlob()
.setName(spreadsheet.getName() + '.pdf');
DriveApp.createFile(blob);
}
ここでは、getSheets()メソッドで全てのシートのIDを取得し、カンマで区切ってURLに追加している。これで複数のシートを一つのPDFにまとめて出力可能だ。
実践
早速やってみよう。シート2が次のような文房具のシートだとする。

すると、

ほれ、文房具のシートが2ページ目として出力されているな。
で、PDFのファイル名は「spreadsheet.getName() + '.pdf'」となっているからスプレッドシートのファイル名になっている。
範囲指定とオプション設定
範囲指定を行い、より具体的なPDFを作成するためのオプション設定も重要だ。
スクリプト
function exportWithRangeAndOptions() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getActiveSheet();
const sheetId = sheet.getSheetId();
const url = 'https://docs.google.com/spreadsheets/d/' + spreadsheet.getId() + '/export?';
const exportOptions = {
format: 'pdf',
gid: sheetId,
range: 'A1:A10',
size: 'A4',
portrait: false,
fitw: true,
gridlines: false,
};
const queryString = Object.keys(exportOptions)
.map(key => key + '=' + encodeURIComponent(exportOptions[key]))
.join('&');
const fullUrl = url + queryString;
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(fullUrl, {
headers: {
Authorization: 'Bearer ' + token,
},
});
const blob = response.getBlob()
.setName(sheet.getName() + '_A1-A10.pdf');
DriveApp.createFile(blob);
}
この例では、範囲をA1:A10に設定し、gridlines: falseでグリッドラインを非表示にするなどのオプションを設定している。
実践
実行すると、

よし、範囲内のA列の商品名だけグリッドなしで出力できてるな。
| オプション | 設定例 | 意味 |
|---|---|---|
format |
pdf |
出力形式をPDFに指定します。 |
gid |
123456789 |
PDF化するシートを指定します。通常は sheet.getSheetId() を使います。 |
range |
A1:C10 |
PDF化するセル範囲を指定します。 |
size |
A4 |
用紙サイズを指定します。 |
portrait |
true |
true で縦向き、false で横向きになります。 |
fitw |
true |
横幅をページ幅に合わせて縮小します。 |
sheetnames |
false |
シート名をPDFに表示するかどうかを指定します。 |
printtitle |
false |
スプレッドシートのタイトルを表示するかどうかを指定します。 |
gridlines |
false |
セルの薄いグリッド線を表示するかどうかを指定します。 |
pagenumbers |
false |
ページ番号を表示するかどうかを指定します。 |
fzr |
false |
固定行を各ページに繰り返し表示するかどうかを指定します。 |
top_margin |
0.50 |
上余白を指定します。 |
bottom_margin |
0.50 |
下余白を指定します。 |
left_margin |
0.50 |
左余白を指定します。 |
right_margin |
0.50 |
右余白を指定します。 |