【GAS】既存のPDFを現在のシートの内容で更新する方法

応用

GAS基礎講座一覧

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

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

前回

【GAS】現在のシートをPDFにしてメールに添付する方法(コピペでできる)
  • スプレッドシートをPDFで出力することができます。
  • さらに特定の範囲や用紙の指定もできます。
  • さららにさらにPDF出力時の細かい設定もできます。
  • 今回は、とっても価値の高い方法をお伝えします。


    これを知ることであなたは、

    • GASで既存のPDFを更新することができます。
    • ファイルIDの取得方法や設定方法がわかります。

    なので、サクッとマスターして

    と答えてあげてください。

    ご質問

    動画の通りPDF出力したファイルをURLで公開したいと考えています。
    その際、以下は実装可能でしょうか?
    ━━━━━━━━━━
    同じPDFファイルとして上書き(更新)= 共有URLは変えない
    ━━━━━━━━━━
    ご教示いただけましたら幸いです。

     

    動画はこちら

    シートはこちら

    *クリックすることでシートが開きます。(コピーしてお使いください)

     

    DriveAPIの追加

    DrvieAPIなるものを使用するのでスクリプトエディタの
    サービスに「Drive API」を追加します。

    Step1.

    ①「サービス」をクリックします。
    ②「Drive API」をクリックします。
    ③「追加」をクリックします。

    ポイント

    PDFの更新はこんな感じでできます。

     Drive.Files.update(resource, fileID, pdfblob)

     

    例)

    Drive.Files.update({ uploadType: 'media' }, fid, pdfblob)

     

     

    スクリプト

    //PDFファイルの生成(サンプル)
    function createpdf() {
      const fileid = SheetToUpdatePDF()
      console.log(fileid)
    
    
      const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
      sh.getRange("K1").setValue(fileid)
    
    
    
    }
    
    
    //PDFファイルの更新(サンプル)
    function updatepdf() {
      const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
      const fid = sh.getRange("K1").getValue()
      console.log(fid)
    
    
      SheetToUpdatePDF(fid)
    }
    
    
    
    /**
     * スプレッドシートの特定の範囲をPDFに出力する
     * fid ファイルID PDFファイルの更新
     *       なし    PDFファイルの生成
     * 戻り値 ファイルID(PDFファイルの生成の場合)
     */
    function SheetToUpdatePDF(fid) {
    
    
    
    
      //-------------------------設定------------------------
      // const FOLDER_ID = '1LW_KFLABRms9N6JhO96LzWvk-_zkCLGW'
      // PDF出力するシートを指定
      const SH_NAME = '目次'
    
    
    
      // 出力する範囲
      const RANGE_F = 'B1'   //開始位置
      const RANGE_T = 'I20'   //終了位置
      // サイズ
      const SIZE = 'A3'
      // 縦横
      const TATE = 'true'   //横の場合は 'false'
      //-------------------------設定------------------------
    
    
    
    
      const shname = SH_NAME + "_1" + ".pdf"
    
    
    
      const ss = SpreadsheetApp.getActiveSpreadsheet()
      const ssId = ss.getId()
      const sheetId = ss.getSheetByName(SH_NAME).getSheetId()
    
    
    
      // スプレッドシートをPDF出力するためのURL
      const url = 'https://docs.google.com/spreadsheets/d/' + ssId + '/export?'
    
    
    
      // PDF出力のオプションを設定
      const options = 'exportFormat=pdf&format=pdf'
        + '&gid=' + sheetId       //PDFにするシートの「シートID」
        + '&portrait=' + TATE     //true(縦) or false(横)
        + '&size=' + SIZE         //印刷サイズ
        + '&gridlines=false'      //グリッドラインの表示有無
        // + '&range=' + RANGE_F + '%3A' + RANGE_T   //セル範囲を指定 %3A はコロン(:)を表す
        + '&top_margin=0.50'      //上の余白
        + '&right_margin=0.50'    //右の余白
        + '&bottom_margin=0.50'   //下の余白
        + '&left_margin=0.50'     //左の余白
        + '&sheetnames=false'     //シート名の表示有無
        + '&printtitle=false'     //スプレッドシート名の表示有無
        + '&pagenum=UNDEFINED'    //ページ番号をどこに入れるか
        + '&scale=1'              //1= 標準100%, 2= 幅に合わせる, 3= 高さに合わせる,  4= ページに合わせる
        + '&horizontal_alignment=CENTER'//水平方向の位置
        + '&vertical_alignment=CENTER'//垂直方向の位置
        + '&gridlines=false'      //グリッドラインの表示有無
        + '&fzr=false'            //固定行の表示有無
        + '&fzc=false'            //固定列の表示有無
    
    
    
    
      console.log(options)
    
    
    
      const requestUrl = url + options
    
    
    
      //API使用のためのOAuth認証
      const token = ScriptApp.getOAuthToken()
    
    
    
      const params = {
        'headers': { 'Authorization': 'Bearer ' + token },
        'muteHttpExceptions': true
      }
    
    
    
      const response = UrlFetchApp.fetch(requestUrl, params)
    
    
    
      //Blobオブジェクトを作成
      const pdfblob = response.getBlob()
      pdfblob.setName(shname) //PDFファイル名を設定
    
    
    
      // 指定のフォルダにPDFファイルを作成
      // const folder = DriveApp.getFolderById(FOLDER_ID)
    
    
      //このスプレッドシートと同じフォルダにPDFファイルを作成
      const parentFolders = DriveApp.getFileById(ss.getId()).getParents()
      const folderId = parentFolders.next().getId()
      const folder = DriveApp.getFolderById(folderId)
    
    
    //ファイルIDの有無により処理が異なる
      if (fid) {    //ファイルIDがある場合
        //PDFファイルの更新
        Drive.Files.update({ uploadType: 'media' }, fid, pdfblob)
    
    
      }
      else {
    
    
        const file = folder.createFile(pdfblob)
        return (file.getId())
    
    
      }
    
    
    
    
    }

     

     

    詳細は動画をご覧ください

     

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

    つぎはこちら

    【GAS基礎講座 14.15.】 ファイル一覧、ファイルのコピー 、一覧をスプレッドシートに出力
    ファイルの一覧をスプレッドシートに出力できます。 Google ドライブでファイル一覧の取得方法がわかります。 ファイルのコピー方法がわかります

     

    GAS基礎講座一覧

    コメント

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