GASでスプレッドシートをPDF化してメール送付する方法~その3 特定の複数シートを送付するver2〜

GAS
この記事は約7分で読めます。

スプレッドシートをPDF化してメールを送付する方法を紹介していきます。

スプレッドシートのPDF化をするときに生じるパターンは主に以下だと思います。

  1. スプレッドシート全体をPDF化したい
  2. 特定の1つのシートをPDF化したい
  3. 特定の複数(2つ以上)のシートをPDF化したい

前回1と2については、過去みていきました。確認されたい方は以下の記事をご確認ください。

GASでスプレッドシートをPDF化してメール送付する方法

前回は残っている3.特定の複数(2つ以上)のシートをPDF化したい、というパターンのうち、送りたいシートだけ選択するという方法をみていきました。

今回は最後となります、送りたくないシートを除外する、という方法をみていきましょう。こちらの方がPDF1枚にまとまって送れて楽という方も多いかと思います。

Advertisements

特定のスプレッドシートをPDF化するための準備

実現方法を考えてみよう

特定のスプレッドシートをPDF化するといった場合どのようなやり方が想定されるでしょうか?ここはまずは頭の使い方についての説明です。

パッと思いつく方法は以下の2つではないでしょうか?

  • 送りたいシートだけ選択する
  • 送りたくないシートを除外する

対象を選ぶ、もしくは対象外を除くという2つのパターンがイメージできましたでしょうか?

別に両方とも実装は可能なのですが、まずはどういう方法ができるかパターンを考えてその中で実装しやすいものを選んでいくというステップが効率的に実装できるようになっていくためには必要です。

GASに限らずpythonやその他の言語でも選択肢を思い描いてから実装する癖をつけていきましょう。

今回実装する方法

さて、上記2つの方法のなかで、今回は前回とは逆パターンの“送りたくないシートを除外する”という方法を考えていきます。

対象となるスプレッドシート

まずは、前提となるスプレッドシートは以下のようになっていました。

  • まとめシート
  • 各社シート
まとめシート画像
各社シートサンプル

ここに、前回シートを選択する機能をつけるために1つシートを追加しました。

要素としては、以下となっていますが今回は注意点が異なります。

・シートインデックス(なんでもいい)
・会社名(シート名と同一である必要
・チェックボックス

前回とは異なり、今回はシート名が大事です。そのため、B列に入力するセル名称は全てシートと同一にしてください。まぁコード側でシートインデックスでシートをhideすればいいだけでもあるのですが。。今回は簡易的にシート名称でsheetをhide処理しているので、ご容赦ください。

特定のシートを選択してPDF化して送付

では、早速特定のシート以外を除外して送るためのコードを説明します。

まず、大前提で、選択対象シートでいづれか複数の会社名をチェックしておいてください。以下のような感じに。(ここは前回と同じです)

では、上のような画像のように選択されている前提で、スクリプトを作成していきましょう。

function createSpecificSheetPDFAndEmail2() {   
   //アクティブシートのIDとGIDを取得する
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getActiveSheet();
   var sheetID = sheet.getSheetId();
   var key = ss.getId();
   var token = ScriptApp.getOAuthToken();

 //特定のページを非表示にする
   //送付対象チェックを取得
   var comList = ss.getSheetByName("送付対象シート").getDataRange().getValues();
   Logger.log(comList);

   //送付対象だけ抜き出し
   var checkedCom = [];
   for(var i=0; i<comList.length; i++){
     if(comList[i][2]===false){
       checkedCom.push(comList[i][1]);
     }
   }
   //非表示処理をする
   for(var i=0; i<checkedCom.length; i++){
     ss.getSheetByName(checkedCom[i]).hideSheet();
   }

 //URLの組み立て
   var url = "https://docs.google.com/spreadsheets/d/" + key + "/export?format=pdf&portrait=false&size=A4&gridlines=false&fitw=true"

 //PDF生成するURLをfetchする
   var pdf = UrlFetchApp.fetch(url, {headers: {'Authorization': 'Bearer ' +  token}}).getBlob().setName("test" + ".pdf");

 //作成したPDFファイルをメールに添付して送る
   var mail = "メールアドレス";
   var subject = "報酬シート";
   var body = "ファイルを送ります";
   GmailApp.sendEmail(mail, subject, body, {attachments:pdf});
 }

基本的には前回説明した特定のシートをPDF化する時と同様にurlFetchでPDFを作成していきます。

前回と異なるのは、今回PDF化されるときに生じる特性を利用して、対象を選択しています。

URLFetchでPDF化するときの特性とは?

シンプルにいってしまうと、visible(UIで見えるようになっている)なsheetしかPDF化はされません

なぜこのような仕様になっているのかは不明ですが、command+Pで印刷設定を開いて、対象をワークシートにしてみると以下のように確かに、非表示処理されているシートは印刷対象になっていないことがわかります。

印刷設定を開いて、右上の印刷対象をワークブックを選択
非表示にされているシートは対象外になっている

ということは、PDF化したくないシートはhide処理をしてしまえばOKな仕様となっています。

シートを非表示にするためには?

シートを非表示にするためのスクリプトが新規に必要になりますので、その部分をみていきましょう。

前回の逆でチェックされていないシートを集めて行けばいいですね。送付対象以外を抜き出すという部分が該当します。

//特定のページを非表示にする
   //送付対象チェックを取得
   var comList = ss.getSheetByName("送付対象シート").getDataRange().getValues();
   Logger.log(comList);

   //送付対象以外を抜き出し
   var checkedCom = [];
   for(var i=0; i<comList.length; i++){
     if(comList[i][2]===false){
       checkedCom.push(comList[i][1]);
     }
   }
   //非表示処理をする
   for(var i=0; i<checkedCom.length; i++){
     ss.getSheetByName(checkedCom[i]).hideSheet();
   } 

そして、複数非表示にするので、for loopでそれぞれsheetNameを要素から取得して、hideSheet()メソッドを使用すれば、チェックしていないシートは全て非表示になります。

その他のスクリプトは一緒ですので割愛します。不明な方はこれまでの記事をみてみてください。

まとめ

特定のシートを選択してPDF化する方法をみていきました。

今回は、選択したシート以外を選ぶという方法を紹介しています。この方法だと、PDFは1つになるので、こちらの方が楽という方も多いかもですね。

シートを印刷するときの特性がそのままGASでも利用できます。スクリプト自体というより、スプレッドシートの特性を理解する必要がありますね。でも、実は特性を理解するって勉強するより、慣れや日頃気づくかですので、是非いつもの作業の中であぁと思うものがあれば頭の片隅に残していくのがいいと思います。

実装のための考え方や応用できそうな要素をぜひ身につけていってください。

関連記事: spreadsheetをPDF化してメール送付する

spreadsheetで作成したデータをPDF化してメールしてみましょう。spreadsheetのPDF化の方法(1つのシート、全てのシート、特定の複数シート)を紹介しています。

  1. GASでスプレッドシートをPDF化してメール送付する方法
  2. GASでスプレッドシートをPDF化してメール送付する方法~その2 特定の複数シートを送付する〜
  3. GASでスプレッドシートをPDF化してメール送付する方法~その3 特定の複数シートを送付するver2〜

コメント