見出し画像

【GAS初心者向け】スプレッドシートをPDFに変換して、メールでPDF送信まで一度に行うスクリプト

見積書・発注書・請求書等をスプレッドシートで作成して、PDFに変換して保存したのち、そのPDFをファイルを取引先に送るケースはよくあるはず。

今回は、そんな場合に便利なコードを書いてみた!

コードの全体像

function mail_Draft() {

const ss = SpreadsheetApp.getActiveSpreadsheet();  //アクティブなスプレッドシートを取得
const ssid = ss.getId();  //スプレッドシートのIDを取得
const sheet = ss.getActiveSheet();  //アクティブなシートを取得
const sheetid = sheet.getSheetId();  //シートIDを取得
const pdfRange = '範囲を入力';  //PDF化範囲

//PDFをエクスポートするURL
const url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace('SSID', ssid);

//PDF化オプションを設定
const opts = {
  exportFormat: 'pdf',
  format:       'pdf',
  size:         'A4',    //出力するサイズ
  portrait:     'true',  //PDFファイルの向き。true:縦向き、false:横向き
  fitw:         'true',  //ページのフィット。true:フィット、false:原寸大
  sheetnames:   'false', //シート名。true:有り、false:無し
  printtitle:   'false', //ドキュメントのタイトル。true:有り、false:無し
  pagenumbers:  'false', //ページ番号。true:有り、false:無し
  gridlines:    'false', //グリッドライン。true:有り、false:無し
  fzr:          'false', //各ページの行見出し。true:含める、false:含めない
  range:        pdfRange,
  gid:          sheetid,
};
 //オプションを「&」で繋げる
var url_ext = [] ;
for( optName in opts ){
  url_ext.push( optName + '=' + opts[optName] );
}
const options = url_ext.join('&');

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

//特定のセルを取得してファイル名を設定
const fileName = sheet.getRange('任意のセル').getValue() + '.pdf';

//PDF作成
const pdf = UrlFetchApp.fetch(url + options, { headers: { 'Authorization': 'Bearer ' + token }, muteHttpExceptions: true }).getBlob().setName(fileName);

//メール作成
var to = "メールアドレス"; //送り先のメールアドレス
var title = "メールの件名"; //件名
var mailText = "本文はここに書く" //メールの本文
GmailApp.sendemail(to, title, mailText , {attachments: pdf}); 

};

コードの概要

全体の構成は、次の通りとなってます

①スプレッドシートを認識して、PDF化する範囲を特定
②PDF化するための諸々の処理
③作成されたPDFを添付してメール送信

という感じです。

気をつけるべき箇所

いくつか要点となる箇所があるので、個別に補足!

①PDF化する範囲の指定

たとえば、「A1からN50」を指定したい場合、「A1:N50」としたいところですが、ここで注意!

コロン(:)は、URLエンコードという奴の都合から「%3A」と記述します!!

なので、たとえば、A1~F10を指定する場合の記述

const pdfRange = 'A1%3AF10'; 

となる訳です。

②PDFファイルの名前

せっかくPDFファイルを自動作成するわけなので、スプレッドシートの特定のセルの情報を取得して、そのままファイル名となるようにしています。

gerRangeの後のカッコの中に任意のセルを入力するだけで、ファイル名も自動で入力されます。

//特定のセルを取得してファイル名を設定
const fileName = sheet.getRange('任意のセル').getValue() + '.pdf';

③PDF化するコード

const url = から const pdf = までの箇所は、PDF化するためのコードが色々と書かれているだけです。よって、特に考えることはせず、そのままコピペしてOKです!

OAuth認証やAPIという概念は、端的に説明することは難しいので、興味ある方はググってみてください~

応用編!!~見積送付のケース~

最後に、メール送信に関して、おすすめの方法です。

見積を作成して、取引先に送る場合、ある程度メール本文はテンプレ化されているはず。そこで、見積書の中から社名や見積番号を取得して、その情報をスプレッドシートに書き込むという処理をしています。

var company = sheet.getRange("特定のセル").getValue(); //社名
var number = sheet.getRange("特定のセル").getValue(); //見積番号
var mailText = 
"{社名}\n〇〇様\n" .replace('{社名}',company) //社名を入れて、リプレイスする
+"\n"
+"平素よりお世話になっております。\n"
+"\n"
+"ご依頼いただきましたお見積について、\n "
+"添付の通りお送りいたします。\n "
+"\n"
+"見積番号:{見積}」" .replace('{見積}',number) //見積番号を入れて、リプレイスする
+"\n"
+"お手数をおかけしますが、ご確認のほどよろしくお願いします。\n"
+"\n"
+"署名"

ここでは、「replace」というメソッドを用いて、社名と見積番号を取得しています。

また、「GmailApp.sendemail」の部分ですが、「createDraft」というメソッドを活用すれば、メールの下書きを作成することも可能です。

いきなり取引先に送るのは避けたいという場合、この方法は非常に便利です。メール本文を加筆修正したり、見積内容に不備不足がないかをダブルチェック的に確認したいときは、下書きのメソッドを使うのもありです!

この場合のコードは次通りとなります。

GmailApp.createDraft(to, title, mailText , {attachments: pdf}); 


以上です!



この記事が参加している募集

#再現してみた

1,769件

この記事が気に入ったらサポートをしてみませんか?