ishi14
@ishi14

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GASでスプレッドシートをPDF化して保存→保存したPDFのURLを取得

解決したいこと

① GASでスプレッドシートをPDF化して保存
② 保存したPDFのURLを取得

以上を実現するスクリプトを書きたいと考えています。

②については、保存されたPDFを右クリックし「リンクを取得」からURLを取得することもできるとは思いますが、1クリックで一連の動作ができるのが理想です。

なお、本件は請求書の社内確認に使用する簡易的なシステムです。
スクリプトを埋め込んでいるスプレッドシートは請求書になります。

参考にした記事

こちらの記事を参照し①については実装ができました。

現在のスクリプト

現在のスクリプトは以下の通りです。

function savePdf(){
  //PDFの保存先
  //★★★フォルダーIDを入力してください★★★
  let folderId = "フォルダーIDを入力";

  //アクティブなスプレッドシートを取得する
  let ss = SpreadsheetApp.getActiveSpreadsheet();

  //スプレッドシートIDを取得する
  let ssId = ss.getId();

  //シートIDを取得する
  let shId = ss.getActiveSheet().getSheetId();

  //B4セルの会社名を取得する
  let fileCorpName = ss.getActiveSheet().getRange("B4").getValue();

  //K4セルの請求書番号を取得する
  let fileNum = ss.getActiveSheet().getRange("K4").getValue();

  //★★★PDFのファイル名を入力してください★★★
  //※ポイント: ファイル名が重複しないようにしましょう
  let fileName = "請求書_管理番号" +  fileNum + "" + fileCorpName + "御中)" ;
  
  //関数createPdfを実行し、PDFを作成して保存する
  createPdf(folderId, ssId, shId, fileName);
}

//PDFを作成し指定したフォルダーに保存する関数
//以下4つの引数を指定する必要がある
//1: フォルダーID (folderId)
//2: スプレッドシートID (ssId)
//3: シートID (shId)
//4: ファイル名 (fileName)
function createPdf(folderId, ssId, shId, fileName){
  //PDFを作成するためのベースとなるURL
  let baseUrl = "https://docs.google.com/spreadsheets/d/"
          + ssId
          + "/export?gid="
          + shId;
 
  //★★★自由にカスタマイズしてください★★★
  //PDFのオプションを指定
  let pdfOptions = "&exportFormat=pdf&format=pdf"
              + "&size=A4" //用紙サイズ (A4)
              + "&portrait=true"  //用紙の向き true: 縦向き / false: 横向き
              + "&fitw=true"  //ページ幅を用紙にフィットさせるか true: フィットさせる / false: 原寸大
              + "&top_margin=0.1" //上の余白
              + "&right_margin=0.15" //右の余白
              + "&bottom_margin=0.1" //下の余白
              + "&left_margin=0.15" //左の余白
              + "&horizontal_alignment=CENTER" //水平方向の位置
              + "&vertical_alignment=TOP" //垂直方向の位置
              + "&printtitle=false" //スプレッドシート名の表示有無
              + "&sheetnames=false" //シート名の表示有無
              + "&gridlines=false" //グリッドラインの表示有無
              + "&fzr=false" //固定行の表示有無
              + "&fzc=false" //固定列の表示有無
              + "&range=A1%3AL47" //範囲の指定;

  //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);

}

発生している問題・エラー

②の実装に向けていくつか記事を参照していますが、どれもうまく動作しません。

参照していた記事

みなさんにアドバイスいただきたいこと

②の実装に向けて追加すべきスクリプトや、そもそも違うアプローチでの実現方法がありましたらご教示いただけますと幸いです。

何卒宜しくお願い致します。

0

1Answer

② 保存したPDFのURLを取得について正しく理解ができたかどうかわかりませんが、例えば、次のような修正はいかがでしょうか。

From:

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

To:

//PDFを指定したフォルダに保存する
const url = folder.createFile(blob).getUrl();
Browser.msgBox(url);

この修正によって、作成したファイルのURLを取得し、それをダイアログでスプレッドシート上に表示します。

0Like

Comments

  1. @ishi14

    Questioner

    @tanaike さま

    コメントいただきありがとうございます。
    アドバイスいただいた内容で想定している動きになりました。

    それと同時にこれができるならもう少し工夫できるかも?
    というアイデアが浮かびましたのでもう少し試行錯誤してみたいと思います。

    こんな初歩的なことに丁寧にご回答いただき感謝です。
  2. ご返事ありがとうございました。

Your answer might help someone💌