質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • Google Apps Script

    722questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

  • Google

    538questions

    Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

GoogleスプレッドシートでPDFの書き出し

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,343

前提・実現したいこと

Googleスプレッドシートでシート毎にPDFに書き出したいです。
現在、開いているページのPDFへの書き出しはできています。
下記サイトを参考にしました。

該当のソースコード

https://www.virment.com/create-pdf-google-apps-script/
こちらのサイトを参考にしました。
この感じでシート毎にファイルが別れて書き出しができたら嬉しいです。
可能なものでしょうか??

試したこと

プログラムがあまり詳しくないため試してはいません。。。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

この感じでシート毎にファイルが別れて書き出しができたら嬉しいです。
可能なものでしょうか??

可能です。コードとしては以下のようなかんじになるでしょう。シート毎にご提示のサイトの記事で紹介されていたcreatePDF メソッドを呼び出し、PDFファイルをマイドライブ直下に保存します。

function testPDF() {
    try {
        // マイドライブ直下に保存
        var root = DriveApp.getRootFolder();
        var folderId = root.getId();

        // 現在開いているスプレッドシートを取得
        var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
        var ssId = spreadsheet.getId();
        var sheets = spreadsheet.getSheets();

        // シート分PDFに出力
        for (var i = 0; i < sheets.length; i++) {
            var sheetId = sheets[i].getSheetId();
            var name = sheets[i].getName();
            // 拡張子抜きのファイル名を生成 "S[シート番号]_[シート名]"
            var baseName = "S" + String(i + 1) + "_" + name;
            // PDFファイルを出力
            createPDF(folderId, ssId, sheetId, baseName);
        }
    } catch (e) {
        Logger.log("Exception: " + e);
    }
}


簡単に書いたコードなので、実際にはファイル名が重複しないようにしたり、フォルダーを指定したりするようになるかと思います。「全シートをシート毎に処理できる」と言うことを示した限りのものです。

プログラムがあまり詳しくないため試してはいません。。。

実際に書いて試してみましょう。ご自分で書いたコードを提示しないとどこが分からないか回答者も分かりませんし、「要望まる投げ」と受け取られて、回答もつきづらくなります。


「どこを修正すべきか?」とのコメントをいただいたので参考に追記します

ご提示のmyFunctionを修正するのであればこのようなコードになるかと思います。PDFファイルはマイドライブ直下に作ります。動作内容をご確認の上、適当に修正してください。

function myFunction() {
    try {
        // マイドライブ直下に保存
        var root = DriveApp.getRootFolder();
        var folderid = root.getId();

        var ss = SpreadsheetApp.getActiveSpreadsheet();

        // 現在開いているスプレッドシートのIDを取得
        var ssId = ss.getId();

        // ファイル名に使用する名前を取得(スプレッドシートのA1)
        var customer_name = ss.getRange("A1").getValue();

        // ファイル名に使用するタイムスタンプを取得
        var timestamp = getTimestamp();

        var sheets = ss.getSheets();

        // シート分PDFに出力
        for (var i = 0; i < sheets.length; i++) {
            // シートIDを取得
            var sheetId = sheets[i].getSheetId();
            // シート名を取得
            var sheetName = sheets[i].getName();
            // 拡張子抜きのファイル名を生成 "[A1セルの内容]_[シート名]_[タイムスタンプ]"
            // var baseName = "S" + String(i + 1) + "_" + name;
            var baseName = customer_name + "_" + sheetName + "_" + timestamp;
            // PDFファイルを出力
            createPDF(folderid, ssId, sheetId, baseName);
        }
    } catch (e) {
        Logger.log("Exception: " + e);
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/03 14:21

    ご回答ありがとうございます。
    そして、初めてこちらを利用させていただいたため、情報が足りず、すみません。。。

    現在こちらのコードで動いています。

    function myFunction(){

    // PDFの保存先となるフォルダID 確認方法は後述
    var folderid = "フォルダURL";

    // マイドライブ直下に保存したい場合は以下
    // var root= DriveApp.getRootFolder();
    // var folderid = root.getId();

    /////////////////////////////////////////////
    // 現在開いているスプレッドシートをPDF化したい場合//
    ////////////////////////////////////////////
    // 現在開いているスプレッドシートを取得
    var ss = SpreadsheetApp.getActiveSpreadsheet();

    // 現在開いているスプレッドシートのIDを取得
    var ssid = ss.getId();

    // 現在開いているスプレッドシートのシートIDを取得
    var sheetid = ss.getActiveSheet().getSheetId();
    // getActiveSheetの後の()を忘れると、TypeError: オブジェクト function getActiveSheet() {/* */} で関数 getSheetId が見つかりません。

    // ファイル名に使用する名前を取得
    var customer_name = ss.getRange("A1").getValue();
    // ここで例として使用しているスプレッドシートのA1に顧客の名前が入っているため、それをファイル名用に取得しているだけです。

    // ファイル名に使用するタイムスタンプを取得
    var timestamp = getTimestamp();

    // PDF作成関数
    createPDF( folderid, ssid, sheetid, customer_name + "_" + timestamp );

    }

    // PDF作成関数 引数は(folderid:保存先フォルダID, ssid:PDF化するスプレッドシートID, sheetid:PDF化するシートID, filename:PDFの名前)
    function createPDF(folderid, ssid, sheetid, filename){

    // PDFファイルの保存先となるフォルダをフォルダIDで指定
    var folder = DriveApp.getFolderById(folderid);

    // スプレッドシートをPDFにエクスポートするためのURL。このURLに色々なオプションを付けてPDFを作成
    var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid);

    // PDF作成のオプションを指定
    var opts = {
    exportFormat: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx
    format: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx
    size: "A4", // 用紙サイズの指定 legal / letter / A4
    portrait: "true", // true → 縦向き、false → 横向き
    fitw: "true", // 幅を用紙に合わせるか
    sheetnames: "false", // シート名をPDF上部に表示するか
    printtitle: "false", // スプレッドシート名をPDF上部に表示するか
    pagenumbers: "false", // ページ番号の有無
    gridlines: "false", // グリッドラインの表示有無
    fzr: "false", // 固定行の表示有無
    gid: sheetid // シートIDを指定 sheetidは引数で取得
    };

    var url_ext = [];

    // 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納
    for( optName in opts ){
    url_ext.push( optName + "=" + opts[optName] );
    }

    // url_extの各要素を「&」で繋げる
    var options = url_ext.join("&");

    // optionsは以下のように作成しても同じです。
    // var ptions = 'exportFormat=pdf&format=pdf'
    // + '&size=A4'
    // + '&portrait=true'
    // + '&sheetnames=false&printtitle=false'
    // + '&pagenumbers=false&gridlines=false'
    // + '&fzr=false'
    // + '&gid=' + sheetid;

    // API使用のためのOAuth認証
    var token = ScriptApp.getOAuthToken();

    // PDF作成
    var response = UrlFetchApp.fetch(url + options, {
    headers: {
    'Authorization': 'Bearer ' + token
    }
    });

    //
    var blob = response.getBlob().setName(filename + '.pdf');

    //}

    // PDFを指定したフォルダに保存
    folder.createFile(blob);

    }

    // タイムスタンプを返す関数
    function getTimestamp () {
    var now = new Date();
    var year = now.getYear();
    var month = now.getMonth() + 1;
    var day = now.getDate();
    var hour = now.getHours();
    var min = now.getMinutes();
    // var sec = now.getSeconds();

    return year + "_" + month;
    }




    // スプレッドシートのメニューからPDF作成用の関数を実行出来るように、「スクリプト」というメニューを追加。
    function onOpen() {
    var sheet = SpreadsheetApp.getActiveSpreadsheet();
    var entries = [
    {
    name : "Create PDF",
    functionName : "myFunction"
    }
    ];
    sheet.addMenu("スクリプト", entries);
    };

    こちらとは別に新規のスクリプトファイルを作って実装したらよろしいでしょうか??

    キャンセル

  • 2017/11/03 14:41

    > こちらとは別に新規のスクリプトファイルを作って実装したらよろしいでしょうか??
    どのように使うか。今のものを修正してもいいでしょうし、新規に作って今のスクリプトをコピーして修正してもいいでしょうし、どちらでもよいと思います。

    キャンセル

  • 2017/11/03 18:54

    このコードを修正する場合はどこを修正するべきかご教授いただけないでしょうか??
    申し訳ありません。。

    キャンセル

  • 2017/11/03 18:57

    質問の内容を越えてませんか。。。?

    キャンセル

  • 2017/11/03 19:31

    追記したのでご確認ください。実際に動作させ、コードの内容を理解された上で質問者様のご要望に沿うように修正してみてください。よろしくお願いします。

    キャンセル

  • 2017/11/03 19:34

    ありがとうございますっ!!
    ご丁寧にしていただき助かりますっ!!!
    試させていただきます!!!

    キャンセル

  • 2017/11/03 23:15 編集

    書き出し成功しましたっ!!!ありがとうございます。
    ただ、PDFファイルが6つまでしか生成されないのは何か原因がありますでしょうか?
    その他は問題なく動きました。

    キャンセル

  • 2017/11/04 00:23 編集

    私が修正したコードの部分ではそのような制限は入れていません。確認しましたが、6つまでと言うより、一定時間の間にたくさんのPDF作成のリクエストを受け付けないよう、GASのサーバー側で拒絶している様子です。(そうでないと大量のPDF作成ができて、負荷がかかってしまう)と言う訳ですので個数は少なく出力するようにしてください。

    キャンセル

  • 2017/11/04 01:08

    そういうことなのですね!!!ありがとうございます!!!個数を少なくして出力するようにします!!!
    無知な私とのやりとりで大変詳しく教えてくださりありがとうございます。
    勉強指定行きます。ありがとうございました!!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Google Apps Script

    722questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

  • Google

    538questions

    Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。