【AIを使ってみた】スプレッドシートからページごとにPDFの設定を切り替えて出力する(未検証)

質問対応

質問対応の一覧

ご訪問ありがとうございます。

Googleシートマスターのひろしです。

 

今回は、ちょっとAI(Copilot)を触ってみました。

以下の動画に対して質問をいただきました。

 

 

ご質問

何時もものすごく助かっています ひとつ教えて頂きたいのですが、SheetTOPDFのGASでは一枚のシートしかPDFにならないのですが、 一枚のシート内のA1からP20を1ページ目にR1からAH20を2ページ目にX1からBD20までを3ページ目に 2ページ目のR1部分と3ページ目のX1部分にB1からI1部分をコピーして貼り付けて用紙サイズとスケールは それぞれのページ毎に設定して_(可能であればスケールのカスタム数値をして)一つのPDFファイルに出力したいのですが どこにどの様な式を書いていいか良くわかりません。ご教授頂けませんでしょうか またスマホからGASを起動してスマホのGoogledriveに保存したいのですが、ご教授頂けませんでしょうか

 

これは、・・・まあ、めんどいですね。

実現するには範囲ごとに設定する必要があるので、ちょっと大変だと思います。

というわけで、『実際にいろいろ試してください』と答えようかと思ったのですが、

AI(Copilot)に聞いてみたところ良さげな答えが返ってきました。

 

動作は未検証ですが参考まで。

 

 

Copilot

 

プロンプト

Copilotのプロンプトには、スクリプトの全文

【GAS】スプレッドシートの特定の範囲をPDF出力する方法(コピペでできる)
  • スプレッドシートをPDFで出力することができます。
  • さらに特定の範囲や用紙の指定もできます。
  • さららにさらにPDF出力時の細かい設定もできます。
  •  

    と質問をコピペして聞いてみました。

    プロンプト 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:I1R1:V1 に貼付 B4 幅に合わせる
    3ページ X1:BD20 B1:I1X1:AF1 に貼付 A3 ページに合わせる

    🛠 アプローチ案:3ファイル出力して1つに結合

    1. 対象範囲ごとにコピーを含めた一時シートを作成
    2. それぞれのシートを希望の印刷設定で個別PDF出力
    3. 最後にそれら3つのPDFを Drive API1ファイルに結合

    🧪 カスタムスクリプト概要(参考)

    • Utilities.newBlob().getDataAsString() などで一時的にPDFを扱い
    • 別ライブラリ(例: PDF-Lib をWeb Apps経由で使う、または Google Workspace Add-on を使う)でPDF結合
    • または、PDFをDriveに保存後、Google Driveの「PDF結合アドオン(無料)」で後から結合操作

    ✍️ 補足:コードを書くにあたって

    以下の情報を教えてもらえると、具体的なコードをご提供できます!

    1. 各ページの用紙サイズ(A4, B4, A3など)やスケールの希望値
    2. PDFを保存したいフォルダID(Google DriveのURLから取得できます)
    3. 一時シートを使っても問題ないか(例:出力専用の PDF_TEMP などを使う)

    このままだと結構骨太なスクリプトになりそうですが、段階的に組み立てていけばOKです🙌
    まずは1ページ目だけPDF化して動作確認してから、順にページを増やすのがおすすめです!

    やってみたい方向性があれば、そこから一緒に書き出していきましょうか?✨

     

    —————————————————————————–

    PDF出力内容まとめが表になっていてわかりやすいですね。

    で、実際のスクリプトがほしいので更に聞いてみました。

    プロンプト2回め

     

    2ページめをやってみてください

     

     

    回答2回め

    ——-以下回答——————–

     

    了解しました!では、リクエストにあった「2ページ目」――R1:AH20 の範囲に B1:I1 をコピーし、横向きB4サイズでPDF出力する部分のGoogle Apps Scriptを作成してみましょう ✨

    🧾 スクリプトのポイント

    • R1:AH20B1: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);
    }

     

    

    🔧 使用手順のまとめ

    1. FOLDER_ID にPDFを保存したいフォルダIDをセット(例:https://drive.google.com/drive/folders/xxxxxxxxxx部分)
    2. SHEET_NAME を出力元のシート名に書き換え
    3. スクリプト実行で B1:I1R1:V1 に追加した R1:AH20 が PDF 出力されます

    このスクリプトが想定通りのPDFになっているか、まずテストしてみてください!
    次は3ページ目のX1:BD20も追加して、全体を1つに結合するステップにも進めますよ😊

    実際に出力されたPDFに改善したい点があれば教えてくださいね!

     


    とのことでした。

    ぜひお試しください。

    そして結果を教えてください

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    最後までご覧いただきありがとうございます。

    つぎはこちら

    【入門編】コピペとは?5分でコピペの達人になる方法(クリップボード完全制覇)
    クリップボードの基本的な使い方がわかります。 クリップボードの履歴からデータをペーストできます。 コピペの達人になります。

    質問対応の一覧

    コメント

    タイトルとURLをコピーしました