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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

3254閲覧

GAS(スプレッドシート)からのメール送信にて書式の反映がされない

Zigsow

総合スコア22

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2023/07/13 08:23

編集2023/07/17 00:26

実現したいこと

GASでの自動メール送信にて、
太字や色付き等の書式を反映させたい。

前提

スプレッドシートからのGASでの自動一斉メール送信プログラムを作りましたが、
太字や色付きなどが反映されない。
スプレッドシートで名前やアドレスなどを記入しそれを取っています。
メール本文はドキュメントに書いてあるものを指定しています。
スプレッドシートに可変的に動かす、名前や会社名などを記入して、
メール本文では自動で可変される仕組みです。

該当のソースコード

GoogleAppScript

1function SendHTMLMail2() { 2 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 const sheet = ss.getSheetByName('アドレス帳(添付なし)'); //シート名指定 5 const lastRow = sheet.getLastRow(); 6 const values = sheet.getRange(1, 1, lastRow, 9).getValues(); 7 const doc = DocumentApp.openById('******'); //ドキュメントIDを入力 8 const docText = doc.getBody().getText(); 9 const value = sheet.getRange("N8").getValue(); 10 const subject = value; //メールの件名(セル指定) 11 const fromName = 'なまえ'; //送信者名表示 12 const options = {name: fromName}; //添付ファイル無の時用 13 14 for(let i=1; i<values.length; i++){ 15 if(values[i][7]=='〇' && values[i][6]!='送信済み'){ //判定が〇かつデータ2が送信済みでなければ処理続行 16 const mailAddress = values[i][2]; //メールアドレス 17 const name = values[i][1]; //名前 18 const company = values[i][3]; //会社・施設名 19 const department = values[i][4]; //部署名 20 const data1 = values[i][5]; //データ1 21 const data2 = values[i][6]; //データ2 22 const judge = values[i][7]; //判定 23 const check = values[i][8]; //送信チェック 24 const body = docText 25 .replace('{'+values[0][1]+'}', name) 26 .replace('{'+values[0][3]+'}', company) 27 .replace('{'+values[0][4]+'}', department) 28 .replace('{'+values[0][5]+'}', data1) 29 .replace('{'+values[0][6]+'}', data2) 30 .replace('{'+values[0][7]+'}', judge) 31 .replace('{'+values[0][8]+'}', check); 32 GmailApp.sendEmail(mailAddress, subject, body, options); 33 sheet.getRange(i+1, 10).setValue("送信済み"); //送信成功後、送信チェックに入力 34 } 35 } 36} 37

試したこと

function SendHTMLMail2() {

const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('アドレス帳(添付なし)'); //シート名指定
const lastRow = sheet.getLastRow();
const values = sheet.getRange(1, 1, lastRow, 9).getValues();

//↓修正した部分
var doc = '******'
var url = 'https://docs.google.com/feeds/download/documents/export/Export?id=' + doc + '&exportFormat=html';
var storageUsed = DriveApp.getStorageUsed(); //これが無いと認証エラー
var param = { method: 'get',
headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()},
muteHttpExceptions: true}; //muteHttp~はエラー回避用
var html = UrlFetchApp.fetch(url, param).getContentText();
//-----↑

const value = sheet.getRange("N8").getValue(); //件名のセル指定
const subject = value; //メールの件名(セル指定)
const fromName = 'なまえ'; //送信者名表示
const options = {name: fromName,htmlBody: html};

for(let i=1; i<values.length; i++){
if(values[i][7]=='〇' && values[i][6]!='送信済み'){ //判定が〇かつデータ2が送信済みでなければ処理続行
const mailAddress = values[i][2]; //メールアドレス
const name = values[i][1]; //名前
const company = values[i][3]; //会社・施設名
const department = values[i][4]; //部署名
const data1 = values[i][5]; //データ1
const data2 = values[i][6]; //データ2
const judge = values[i][7]; //判定
const check = values[i][8]; //送信チェック
const body = html //修正箇所
.replace('{'+values[0][1]+'}', name)
.replace('{'+values[0][3]+'}', company)
.replace('{'+values[0][4]+'}', department)
.replace('{'+values[0][5]+'}', data1)
.replace('{'+values[0][6]+'}', data2)
.replace('{'+values[0][7]+'}', judge)
.replace('{'+values[0][8]+'}', check);
GmailApp.sendEmail(mailAddress, subject, body, options);
sheet.getRange(i+1, 10).setValue("送信済み"); //送信成功後、送信チェックに入力
}
}
}

上記にて試しましたが、ドキュメントに記載した内容をそのまま反映されたので、
色付きや太字などはできたのですが、今度は可変的に動くべきところが反映されずという事態になってしまいました。
{名前}  {会社名}としているところが左記のまま表示されています。
本来、スプレッドシートにある名前や会社名が反映されるはずでした。。。

補足情報(FW/ツールのバージョンなど)

このようなスプレッドシートです。
イメージ説明

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

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

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

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

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

guest

回答1

0

doc.getBody().getText()では書式等まで取得できずテキストのみの取得となります。
指定のドキュメントをHTMLとして取得しなくてはなりません。

【GAS】Googleドキュメントを装飾そのままHTMLメールに変換
こちらの記事が参考になるかと思います。

投稿2023/07/13 10:50

YAmaGNZ

総合スコア10542

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

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

Zigsow

2023/07/13 23:56

初心者なのでもし可能でしたらどこをどのように直したらよいか教えてもらえると助かります。すいません。
YAmaGNZ

2023/07/14 00:30

私が提示したページのhtmlという変数に値を取得しているものがdocTextとなります。 よって現状のdocTextを取得している部分を私が提示したhtmlを取得しているものに変更すればいいかと思います。
Zigsow

2023/07/14 00:38

サイトを参考にやってみたのですが、HTMLを取得し、ドキュメントの内容そのまま(色付き、太字等)反映されるようにはなったのですが、可変的に動かす部分が反映されず、ドキュメントの内容そのままの状態で送られるようになってしまいました。。。
YAmaGNZ

2023/07/14 00:53

取得したhtmlにreplaceかければいけると思いますが・・・ 「こう変更してこうなった」といった情報を出してもらわないと私にはどのように変更されたかは分かりませんので表面的なことしか言えません。
Zigsow

2023/07/14 02:46

試したことの欄に、修正したプログラムを書いたのですが、いかがでしょうか。
YAmaGNZ

2023/07/14 03:06

optionsの設定をメール送信直前にしたら変わりますか?
Zigsow

2023/07/16 23:38

返信が遅くなり申し訳ございません。 直前に設定しても変化なしでした。 (GmailApp.sendEmail(mailAddress, subject, body, options);の前) ドキュメントには、 ↓↓ {会社・施設名} {部署名} {名前} 様 いつも大変お世話になっております。 ↑↑ のようなかたちで記載しており、{}の部分が可変する仕組みです。 HTMLメールを取得するような書き換えたら、上記の{}の部分も そのまま({会社・施設名})のように表示されているといった具合です。
YAmaGNZ

2023/07/17 00:31

const options = {name: fromName,htmlBody: html}; GmailApp.sendEmail(mailAddress, subject, body, options); とされたのでしょうか? htmlはreplaceにて置き換えを行っていないHTMLが格納されていて、bodyにはreplaceにて置き換えが行われているHTMLが格納されているということは理解されていますか? そして、メール送信する際の GmailApp.sendEmail(mailAddress, subject, body, options); にて指定するbodyの部分ですが、これはメーラー等でメールの表示を「プレーンテキスト」等に設定した場合に表示されるものとなります。 そして、optionsに設定したhtmlBody: htmlの部分がメーラー等でメールの表示を「HTML」等に設定した場合に表示される内容となります。 現状ですと、HTML表示した場合は{会社・施設名}等が置き換わっていないHTMLがプレーンテキスト表示した場合は{会社・施設名}等は置き換わっているが、HTMLタグなども入った状態のテキストが表示されるでしょう。 なので const options = {name: fromName,htmlBody: body}; GmailApp.sendEmail(mailAddress, subject, body, options); としてやればとりあえずHTML表示ではちゃんと表示されるかと思います。 プレーンテキスト表示状態でもちゃんと表示されるようにするには、今回の修正前の方法でテキストを取得してbodyのところに設定してやればいいでしょう。
Zigsow

2023/07/17 06:57

まさにご回答いただいた通りに書きました。 const options = {name: fromName,htmlBody: body}; こちらに修正しても、結果は変わらずHTML表示にはなってますが、可変的なところがそのままでした。 bodyのとことの設定というのは、どのようにしたらよいでしょうか。 お手数ですがご教授いただければ幸いです。
YAmaGNZ

2023/07/17 07:42

そうなってくると const body = html //修正箇所 .replace('{'+values[0][1]+'}', name) .replace('{'+values[0][3]+'}', company) .replace('{'+values[0][4]+'}', department) .replace('{'+values[0][5]+'}', data1) .replace('{'+values[0][6]+'}', data2) .replace('{'+values[0][7]+'}', judge) .replace('{'+values[0][8]+'}', check); こちらで正常に置き換わっていないということになると思います。 この前後でログを出力するなどして確認してみてください。
Zigsow

2023/07/17 07:59

ただ、docTextで取得する場合(該当のソースコード欄で記載しているソース)の状態では、 正常に置き換わっております。 ログでvalues[2][1]などを出力してもちゃんと置き換わったデータが格納されています。
YAmaGNZ

2023/07/17 11:07

docTextの時どうだったかではなくhtmlを変換した時どうなっているのかです。 例えばhtmlでは {<何かタグ>会社・施設名</タグ閉じる>} みたいになっていてreplaceできていないかもしれません。 なので、ログを出力する等して実際に置き換わっているのかを確認しましょうということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問