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

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

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

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

JavaScript

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

3624閲覧

スプレッドシートの値をテンプレートリテラルとして取得したい

yoshi_10_11

総合スコア241

Google Apps Script

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

JavaScript

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2018/02/19 09:58

編集2018/02/19 10:30

※もしかしたら用語の使い方が間違っているかもしれません。ご了承ください。

Googleフォームで質問に答えて送信すると、スプレッドシートにあらかじめ書かれているテンプレートに反映された文章がメールで送れられてくる…といった仕組みを作りたいと思っています。

例えば、GoogleスプレッドシートのセルA1に

「こんにちは${name}です。年齢は${age}です。」

という文章をあらかじめ書いておきます。

そして、Googleフォームから送信されて取得した名前と年齢のデータをそれぞれ変数name、ageに格納します。
例:name = 山田、age = 25
その後、スプレッドシートに用意したテンプレートに記載されている埋め込み変数に反映させて、sendMail関数で「こんにちは山田です。年齢は25です。」という内容をメール送信します。

通常、Google Apps Scriptでスプレッドシートからデータを取得する場合、

javascript

1sheet.getRange(1, 1).getValue();

で取得することになると思います…が、それですと、先ほど書いた「こんにちは${name}です。年齢は${age}です。」はすべて文字列として取得してしまい、変数が反映されません。
テンプレートリテラルへの変換方法があるのかもしれませんが、ググってもどうしてもわかりませんでした…

テンプレートの中身を自由に変更できる仕様にしたいと思い、なんとかこの機能を実装したいと思っています。ご回答お待ちしております。よろしくお願い致します!

【追記】
一応、GAS側の処理で余分な部分を省いたものを記載しておきます。。。急いでいろいろ省いたので抜けもあるかもしれません…

javascript

1function sendMail(e){ 2 var ss = SpreadsheetApp.openById(ID).getActiveSheet; 3 var row = answerss.getLastRow(); 4 var items = e.response.getItemResponses(); 5 for(var p = 0; p < items.length; p++){ 6 answerss.getRange(row + 1, p + 2).setValue(items[p].getResponse()); 7 } 8//訳あってfor文でスプレッドシートに書き込んでいます 9 10 var row = ss.getLastRow(); 11 var name = ss.getRange(row, 1).getValue(); 12 var age = ss.getRange(row, 2).getValue(); 13 var dataRow = datass.getLastRow(); 14 15 var body = "投稿がありました。"; 16 17 body += ss.getRange(2, 1).getValue(); //ここでテンプレートを読み込んでいる 18 19 GmailApp.sendEmail(メールアドレス, "投稿がありました", body);

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

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

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

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

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

guest

回答1

0

ベストアンサー

うまく行くか知らんけれど, eval使えばいいかも.

JavaScript

1eval("`" + sheet.getRange(1, 1).getValue() + "`");

ES6が使えないっぽいので, replace + evalで強引に.

JavaScript

1body += ss.getRange(2, 1).getValue() 2 .replace(/($\{([a-zA-Z]+?)\})/g, function(m, p1, p2){return eval(p2);});

投稿2018/02/19 10:16

編集2018/02/19 11:04
defghi1977

総合スコア4756

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

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

yoshi_10_11

2018/02/19 10:30

ご回答ありがとうございます!残念ながら、エラーが出てうまくいきませんでした。。。
defghi1977

2018/02/19 10:35

セミコロン抜いたからこれでうまく行きません?
yoshi_10_11

2018/02/19 10:40

「SyntaxError: 文字が無効です。」と出てダメですね…
defghi1977

2018/02/19 10:48

ああ, Google Apps Script自体がES6(テンプレートリテラル)を解釈出来ないということか. まあmatchとevalで何とかなるか
yoshi_10_11

2018/02/19 11:22

ありがとうございます。試してみましたが変数がそのまま表示されてしまいました…Google Apps Scriptで採用されているJavaScriptのバージョンが古いためにうまくいかないんですね…教えてくださりありがとうございます。
退会済みユーザー

退会済みユーザー

2018/02/19 13:36

eval() 使えますし、defghi1977さんのコードで問題ないですよ。(簡単ですが、テストしました) eval()の引数が間違っているとかではないでしょうかね? return の前に Logger.log() を追記し、確認してみてはいかがでしょうか? 例).replace(/($\{([a-zA-Z]+?)\})/g, function(m, p1, p2){Logger.log(p2); return eval(p2);});
yoshi_10_11

2018/02/20 00:36

defghi1977さん、stshishoさん 今朝じっくりコードを確認して実行してみたらうまく動作いたしました!今回のケース以外にもreplaceやevalって使い道多そうですね!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問