【範囲自在】スプレッドシートを表のままメールで送信する【GAS】【Googleスプレッドシート】 【Gmail】
前回の記事で、「2×2」の表をメールで送信するスクリプトを作成しました。このnoteのコンセプトを守って、配列(value[0][2]とかこんな表現)は使っておらず、getRangeとgetValueが基本での記載内容です。
今回は実用度を上げてみて、もっと大きな範囲に対応できるようにしてみます。
CSSやスタイルもつかっていない原始的な記法ですので、コピペ後の手直しもやりやすいと思います。
前回の記事のコードです。
function mailHTML_hyou3 ( ) { //表を送信
var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var word1= sheet.getRange(2,2,1,1).getValue();
var word2=sheet.getRange(2,3,1,1).getValue();
var word3=sheet.getRange(3,2,1,1).getValue();
var word4=sheet.getRange(3,3,1,1).getValue();
var body= "<table border ><tr><td>"+word1+"</td><td>"+word2+"</td> </tr><tr><td>"+word3+"</td><td>"+word4+"</td></tr></table>"
GmailApp.sendEmail( ' aaa@bbb.com ' , 'タイトル', body, { htmlBody:body} );
}
ポイントとなる、HTML本文の構造を限定して記載しました。
"<table border ><tr><td>"+word1+"</td><td>"+word2+"</td> </tr><tr><td>"+word3+"</td><td>"+word4+"</td></tr></table>"
「""」で区切ったタグと、取得したいセルの値を順序だてて並べています。
HTMLの表の記載は繰り返しで作成できる。
改行して記載するとこのように記載することができます。
"<table border >
<tr>
<td>"+word1+"</td><td>"+word2+"</td>
</tr>
<tr>
<td>"+word3+"</td><td>"+word4+"</td>
</tr>
</table>"
2列2行の表なら全文記載が可能です。今回は、行も列も増やした表を作成したいので、繰り返しの記法で作成します。
構文の整理
さきほどの構文のルールを読み解くと
1.一番外枠を<table>で囲む
2.行ごとに、<tr>で囲む
3.一行に対して、セルごとに<td>で囲む
となります。
それぞれを繰り返して作成するイメージは次のようになります。
1.まずは、一行に対してセルを<td>で囲むスクリプト
var body= "<table border='1' cellspacing='0' >"
for(x=2;x<=5;x++) { //TDを4つ
var word= sheet.getRange(2,x,1,1).getValue();
var body=body + "<td>" +word+ "</td>"
}
var body = body + "</table>"
body がどうなるか記載してみます。
ゼロ回目:初期設定
<table border='1' cellspacing='0' >
2回目:x=2
<table border='1' cellspacing='0' ><td> +word(x=2)+ </td>
3回目:x=3
<table border='1' cellspacing='0' ><td> +word(x=2)+ </td><td> +word(x=3)+ </td>
4回目:x=4
<table border='1' cellspacing='0' ><td> +word(x=2)+ </td><td> +word(x=3)+ </td><td> +word(x=4)+ </td>
5回目:x=5
<table border='1' cellspacing='0' ><td> +word(x=2)+ </td><td> +word(x=3)+ </td><td> +word(x=4)+ </td><td> +word(x=5)+ </td>
5回終わると最後に</table>を書き加える
<table border='1' cellspacing='0' ><td> +word(x=2)+ </td><td> +word(x=3)+ </td><td> +word(x=4)+ </td><td> +word(x=5)+ </td></table>
これで、1行5列の表示するHTMLができました。
2.行を繰り返し作成するスクリプト
var body= "<table border='1' cellspacing='0' >"
for(y=2;y<=8;y++){
var body = body +"<tr>"
for(x=2;x<=5;x++){//TDを4つ
var word= sheet.getRange(2,x,1,1).getValue();//あえて「2」
var body=body + "<td>" +word+ "</td>"
}
var body=body +"</tr>"
}
var body = body + "</table>"
ちょっと複雑さが上がりました。
まずは構文確認のため、一行の中身は同じ列が、8列増えるというコードです。
for(y=2;y<=8;y++){
var body = body +"<tr>"
for(x=2;x<=5;x++){【さっきの列を増やしていくfor文】}
var body=body +"</tr>"
}
さきほどのforを8回繰り返して列を8列にする構文の中に入れています。
形が整いましたので、最後に定数を変数にします。
行数を変数にして完成:getRange(y,x,1,1)←getRange(2,x,1,1)
var body= "<table border='1' cellspacing='0' >"
for(y=2;y<=8;y++){
var body = body +"<tr>"
for(x=2;x<=5;x++){//TDを4つ
var word= sheet.getRange(y,x,1,1).getValue();//yに変更
var body=body + "<td>" +word+ "</td>"
}
var body=body +"</tr>"
}
var body = body + "</table>"
全体表示
function mailHTML_mat3 ( ) { //表を送信
var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var body= "<table border='1' cellspacing='0' >"
for(y=2;y<=8;y++){
var body = body +"<tr>"
for(x=2;x<=5;x++){//TDを4つ
var word= sheet.getRange(y,x,1,1).getValue();//yに変更
var body=body + "<td>" +word+ "</td>"
}
var body=body +"</tr>"
}
var body = body + "</table>"
Logger.log(body)
GmailApp.sendEmail( ' aaa@bbb.com ' , 'タイトル', body, { htmlBody:body} );
}
ちょこっと範囲を変えれるようにスプレッドシート内で範囲を指定できるようにする
先ほどまでは、
列:2~5
行:2~8
の表に対応できるように限定化した書き方でした。
for(y=〇;y<=〇;y++)
for(x=〇;x<=〇;x++)
この〇を変更するのに、スクリプトを書き直すのではなく、スプレッドシート内で指定するという方法です。
セルを指定して、そこに記載するだけですね。range1,range2,range3,range4を設定して記載しています。
function mailHTML_mat4 ( ) { //範囲指定
var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var renge1=sheet.getRange(2,8,1,1).getValue()//起点の行 2
var renge2=sheet.getRange(2,9,1,1).getValue()//起点の列 2
var renge3=sheet.getRange(3,8,1,1).getValue()//終点の行
var renge4=sheet.getRange(3,9,1,1).getValue()//終点の列
var body= "<table border='1' cellspacing='0' >"
for(y=renge2;y<=renge3;y++){
var body = body +"<tr>"
for(x=renge1;x<=renge4;x++){//TDを4つ
var word= sheet.getRange(y,x,1,1).getValue();//yに変更
var body=body + "<td>" +word+ "</td>"
}
var body=body +"</tr>"
}
var body = body + "</table>"
Logger.log(body)
GmailApp.sendEmail( ' aaa@bbb.com ' , 'タイトル', body, { htmlBody:body} );
}
こちらで完成です。
最後に、表だけではなく、テキスト・URLリンクも記載できるようにフォームを設定しました。
function mailHTML_mat5 ( ) { //範囲指定
var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var renge1=sheet.getRange(2,8,1,1).getValue()//起点の行 2
var renge2=sheet.getRange(2,9,1,1).getValue()//起点の列 2
var renge3=sheet.getRange(3,8,1,1).getValue()//終点の行
var renge4=sheet.getRange(3,9,1,1).getValue()//終点の列
var body= "<table border='1' cellspacing='0' >"
for(y=renge2;y<=renge3;y++){
var body = body +"<tr>"
for(x=renge1;x<=renge4;x++){//TDを4つ
var word= sheet.getRange(y,x,1,1).getValue();//yに変更
var body=body + "<td>" +word+ "</td>"
}
var body=body +"</tr>"
}
var body = body + "</table>"
var body = body + "<h1>テキストもついかする</h1>";
var body=body + "<a href='https://note.com/gas_keiri'>keirigas</a>";
Logger.log(body)
GmailApp.sendEmail( ' aaa@bbb.com ' , 'タイトル', body, { htmlBody:body} );
}
まとめ
メールの宛先もよく変更するようであれば、スプレッドシート内の変数で指定してもいいかもしれません。タイトルもですね。
こちらの記事で、図形やメニューからの起動ができれば実用性は高くなるのではないでしょうか。
この記事が参加している募集
どんな記事ならサポートしてみようと思えるか、ご要望ありましたら教えてくださいね。