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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Google Apps Script

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

Q&A

解決済

1回答

1091閲覧

【GAS】スプレッドシートの指定した範囲のPDFの作成し、メールに添付をしてメールを自動送信する

Yutaengineer

総合スコア2

Google Apps Script

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

0グッド

2クリップ

投稿2024/01/16 11:29

実現したいこと

GAS初心者です。

「スプレッドシートの指定した範囲のPDFの作成し、メールに添付をしてメールを自動送信する」コードを書きたいと思っておりますが、実行できず困っています。
解決方法がわかる方がいらっしゃいましたら教えていただけますと幸いです。

実現したいことは下記の通りです。
・スプレッドシートのシート名は特定しない。
(スプレッドシート内にボタンを作り、ボタンを押せばスクリプトが実行される仕組みにしたい)
・スプレッドシートの指定した範囲のPDFの作成し、メールに添付をしてメールを自動送信したい。
・メールの宛先、Cc、件名、本文は、スプレッドシートに記載してそこから情報を取得したい。

発生している問題・分からないこと

下のようなエラーメッセージ出ており、スクリプトを実行出来ません。

エラーメッセージ

error

1エラー 2Exception: The parameters (number[]) don't match the method signature for Utilities.newBlob. 3sendEmailWithAttachment @ 無題.gs:17

該当のソースコード

GAS

117行目 var pdf = Utilities.newBlob(values); 2 3念のためにコードの全文載せておきます。↓ 4function sendEmailWithAttachment() { 5 // スプレッドシートを取得 6 var sheet = SpreadsheetApp.getActiveSpreadsheet(); 7 8 // メールの宛先、Cc、件名、本文を取得 9 var to = sheet.getRange("AO39").getValue(); 10 var cc = sheet.getRange("AO47").getValue(); 11 var subject = sheet.getRange("AO55").getValue(); 12 var body = sheet.getRange("AO63").getValue(); 13 14 // 指定した範囲のPDFを作成 15 var startRow = 1; 16 var endRow = 88; 17 var startColumn = 1; 18 var endColumn = 38; 19 var values = sheet.getRange("A1:AL88").getValues(); 20 var pdf = Utilities.newBlob(values); 21 var pdfId = Utilities.parseBlob(pdf).getId(); 22 23 // メールを作成 24 var mail = GmailApp.createEmail(); 25 mail.setSubject(subject); 26 mail.setBody(body); 27 mail.addTo(to); 28 if (cc) { 29 mail.addCc(cc); 30 } 31 mail.addAttachment(pdfId); 32 mail.send(); 33}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

PDFのセル範囲の方法が間違っていると想定しており、セル範囲指定の入力を変更しても、「Exception: The parameters (String,number,number,number) don't match the method signature for SpreadsheetApp.Spreadsheet.getRange.」といったエラーが出るだけで実行出来ませんでした。

補足

特になし

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

お示しいただいたスクリプトを修正することが難しかったので、
新たなスクリプトの例を記載しておきます。

JavaScript

1function exportPDF() { 2 // 初期設定 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 const sheet = ss.getActiveSheet(); 5 const ssId = ss.getId(); 6 const sheetId = sheet.getSheetId(); 7 const range = 'A1:AL88' 8 .replace(':', '%3A');//URL貼付け用'%3A'はURLでの':'の表現 9 const cellTo = 'AO39'; 10 const cellCc = 'AO47'; 11 const cellSubject = 'AO55'; 12 const cellBody = 'AO63'; 13 const date = new Date(); 14 const fileName = Utilities.formatDate(date, 'JST', 'yyyyMMddHHmmss') + '.pdf'; 15 16 // PDFの出力オプション設定 17 const options = { 18 exportFormat: 'pdf', 19 format: 'pdf', 20 size: 'A4', // 出力サイズ 21 portrait: 'true', // PDFの向き true:縦 false:横 22 fitw: 'true', // ページフィット true:フィット false:原寸大 23 scale: '2', // スケール 1:標準100% 2:幅に合わせる 3:高さに合わせる 4:ページに合わせる 24 top_margin: '0.100', // 上余白(単位:cm) 25 bottom_margin: '0.100', // 下余白 26 left_margin: '0.100', // 左余白 27 right_margin: '0.100', // 右余白 28 sheetnames: 'false', // シート名 true:有 false:無 29 printtitle: 'false', // タイトル true:有 false:無 30 pagenum: 'RIGHT', // ページ番号位置 31 gridlines: 'false', // グリッドライン true:有 false:無 32 fzr: 'true', // 行見出し true:含める false:含めない 33 fzc: 'true', // 列見出し true:含める false:含めない 34 range: range, // 選択範囲(A1形式で':'を’%3A'で置換してある) 35 gid: sheetId // シートID 36 }; 37 38 // URL用の文字列を生成(optionsのキーと値を&で繋ぐ) 39 const urlOptions = Object.keys(options).map((v) => v + '=' + options[v]).join('&'); 40 41 //PDFを生成 42 const url = 'https://docs.google.com/spreadsheets/d/' + ssId + '/export?' + urlOptions; 43 const params = { headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() }, muteHttpExceptions: true }; 44 const pdf = UrlFetchApp.fetch(url, params).getBlob().setName(fileName); 45 46 // メールの宛先、Cc、件名、本文を取得 47 const to = sheet.getRange(cellTo).getValue(); 48 const cc = sheet.getRange(cellCc).getValue(); 49 const subject = sheet.getRange(cellSubject).getValue(); 50 const body = sheet.getRange(cellBody).getValue(); 51 52 // PDFを添付してメールを送信 53 const attachments = [pdf]; 54 GmailApp.sendEmail(to, subject, body, {cc, attachments}); 55}

投稿2024/01/18 03:37

編集2024/01/18 04:06
YellowGreen

総合スコア861

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YellowGreen

2024/01/18 04:08

PDFの体裁は、出力オプション設定のところで調整してください。
Yutaengineer

2024/01/18 06:44

YellowGreenさん 回答ありがとうございます! おかげで無事にスクリプトが実行されました! 大変助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問