ご訪問ありがとうございます。
Googleシートマスターのひろしです。
今回は、ちょっとAI(Copilot)を触ってみました。
以下の動画に対して質問をいただきました。
ご質問
これは、・・・まあ、めんどいですね。
実現するには範囲ごとに設定する必要があるので、ちょっと大変だと思います。
というわけで、『実際にいろいろ試してください』と答えようかと思ったのですが、
AI(Copilot)に聞いてみたところ良さげな答えが返ってきました。
動作は未検証ですが参考まで。
Copilot
プロンプト
Copilotのプロンプトには、スクリプトの全文

と質問をコピペして聞いてみました。
プロンプト 1回め
/**
* スプレッドシートの特定の範囲をPDFに出力する
*/
function SheetToPDF() {
・・・・全文をコピペ・・・・
// 指定のフォルダにPDFファイルを作成
const folder = DriveApp.getFolderById(FOLDER_ID)
folder.createFile(pdfblob)
}
を 一枚のシート内のA1からP20を1ページ目にR1からAH20を2ページ目にX1からBD20までを3ページ目に 2ページ目のR1部分と3ページ目のX1部分にB1からI1部分をコピーして貼り付けて用紙サイズとスケールは それぞれのページ毎に設定して_(可能であればスケールのカスタム数値をして)一つのPDFファイルに出力したいのです
Copilotの回答
以下がCopilotの回答です。
すばらしい。
ちゃんと動くかはわかりませんが、それっぽい答えが返ってきました。
———-以下、回答——————-
面白いチャレンジですね!Google Apps Script で スプレッドシートの一部を複数ページに分けて PDF 出力し、かつ各ページで異なるサイズ・スケールを設定しつつ、特定セルのコピー&貼り付けを自動で行う――というのは、なかなかテクニカルですが可能です。
ただし、Google Sheets の export
エンドポイントでは 「複数範囲・異なる設定の PDF をまとめて出力」 という機能が直接サポートされていません。そこで、以下のような手順で対応可能です:
✅ 実現したいPDF出力内容まとめ
ページ | 範囲 | 貼り付けたい内容 | サイズ | 向き | スケール(例) |
---|---|---|---|---|---|
1ページ | A1:P20 |
なし | A4 | 縦 | 90%(custom可) |
2ページ | R1:AH20 |
B1:I1 を R1:V1 に貼付 |
B4 | 横 | 幅に合わせる |
3ページ | X1:BD20 |
B1:I1 を X1:AF1 に貼付 |
A3 | 横 | ページに合わせる |
🛠 アプローチ案:3ファイル出力して1つに結合
- 対象範囲ごとにコピーを含めた一時シートを作成
- それぞれのシートを希望の印刷設定で個別PDF出力
- 最後にそれら3つのPDFを Drive API で 1ファイルに結合
🧪 カスタムスクリプト概要(参考)
Utilities.newBlob().getDataAsString()
などで一時的にPDFを扱い- 別ライブラリ(例: PDF-Lib をWeb Apps経由で使う、または Google Workspace Add-on を使う)でPDF結合
- または、PDFをDriveに保存後、Google Driveの「PDF結合アドオン(無料)」で後から結合操作
✍️ 補足:コードを書くにあたって
以下の情報を教えてもらえると、具体的なコードをご提供できます!
- 各ページの用紙サイズ(
A4
,B4
,A3
など)やスケールの希望値 - PDFを保存したいフォルダID(Google DriveのURLから取得できます)
- 一時シートを使っても問題ないか(例:出力専用の
PDF_TEMP
などを使う)
このままだと結構骨太なスクリプトになりそうですが、段階的に組み立てていけばOKです🙌
まずは1ページ目だけPDF化して動作確認してから、順にページを増やすのがおすすめです!
やってみたい方向性があれば、そこから一緒に書き出していきましょうか?✨
—————————————————————————–
PDF出力内容まとめが表になっていてわかりやすいですね。
で、実際のスクリプトがほしいので更に聞いてみました。
プロンプト2回め

回答2回め
——-以下回答——————–
了解しました!では、リクエストにあった「2ページ目」――R1:AH20
の範囲に B1:I1
をコピーし、横向きB4サイズでPDF出力する部分のGoogle Apps Scriptを作成してみましょう ✨
🧾 スクリプトのポイント
R1:AH20
にB1:I1
をコピー(値のみ)- 一時シートを作成して操作(元データを壊さないため)
- 出力サイズ:B4
- 向き:横
- スケール:幅に合わせる(
scale=2
)
✅ サンプルコード
function exportSecondPageToPDF() {
const FOLDER_ID = 'ここに保存先フォルダIDを入れてください';
const SHEET_NAME = '元データのシート名';
const TEMP_SHEET_NAME = 'PDF_TEMP_2';
const PDF_NAME = 'Page2_R1_AH20.pdf';
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sourceSheet = ss.getSheetByName(SHEET_NAME);
// 既存の一時シートがあれば削除
const oldTemp = ss.getSheetByName(TEMP_SHEET_NAME);
if (oldTemp) ss.deleteSheet(oldTemp);
// 一時シート作成
const tempSheet = sourceSheet.copyTo(ss);
tempSheet.setName(TEMP_SHEET_NAME);
// 不要範囲をクリア(見た目を整える場合は調整可)
tempSheet.getDataRange().clearContent();
// B1:I1 を取得して R1 に貼付け
const headerValues = sourceSheet.getRange('B1:I1').getValues();
tempSheet.getRange('R1:Y1').setValues(headerValues);
// R1:AH20 を貼り付け
const values = sourceSheet.getRange('R1:AH20').getValues();
tempSheet.getRange('R1:AH20').setValues(values);
// シートID取得
const sheetId = tempSheet.getSheetId();
const ssId = ss.getId();
// PDF用URLとパラメータ
const url = `https://docs.google.com/spreadsheets/d/${ssId}/export?exportFormat=pdf&format=pdf`
+ `&gid=${sheetId}`
+ `&portrait=false`
+ `&size=B4`
+ `&range=R1%3AAH20`
+ `&gridlines=false`
+ `&printtitle=false`
+ `&sheetnames=false`
+ `&pagenum=UNDEFINED`
+ `&scale=2`; // 幅に合わせる
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(url, {
headers: { Authorization: `Bearer ${token}` },
muteHttpExceptions: true
});
const blob = response.getBlob().setName(PDF_NAME);
const folder = DriveApp.getFolderById(FOLDER_ID);
folder.createFile(blob);
// 後片付け
ss.deleteSheet(tempSheet);
}
🔧 使用手順のまとめ
FOLDER_ID
にPDFを保存したいフォルダIDをセット(例:https://drive.google.com/drive/folders/xxxxx
のxxxxx
部分)SHEET_NAME
を出力元のシート名に書き換え- スクリプト実行で
B1:I1
をR1:V1
に追加したR1:AH20
が PDF 出力されます
このスクリプトが想定通りのPDFになっているか、まずテストしてみてください!
次は3ページ目のX1:BD20も追加して、全体を1つに結合するステップにも進めますよ😊
実際に出力されたPDFに改善したい点があれば教えてくださいね!
とのことでした。
ぜひお試しください。
そして結果を教えてください
最後までご覧いただきありがとうございます。
つぎはこちら

コメント