メールエンティティでの本文の取付方

以下のようにメール本文をHTMLに直書きするとロボット(クローラー)が自動的にメールアドレスを取得して広告メールなんかが爆裂に飛んできてしまう。

<a href="mailto:abc@abc.com">Mail</a>

そこで、以下のようなサイト

https://www.luft.co.jp/cgi/coding.php

を利用してメールエンティティ化する。こうするとメールアドレスが直接HTMLにかかれていないため、拾われることがない。

<script type="text/javascript">
<!--
function converter(M){
var str="", str_as="";
for(var i=0;i<M.length;i++){
str_as = M.charCodeAt(i);
str += String.fromCharCode(str_as + 1);
}
return str;
}
function mail_to(k_1,k_2)
{eval(String.fromCharCode(108,111,99,97,116,105,111,110,46,104,114,101,102,32,
61,32,39,109,97,105,108,116,111,58) 
+ escape(k_1) + 
converter(String.fromCharCode(96,97,98,63,102,108,96,104,107,45,98,110,108,
62,114,116,97,105,100,98,115,60)) 
+ escape(k_2) + "'");} 
document.write('<a href=JavaScript:mail_to("","")>(必ずお問い合わせなどの文字を入力してください)<\/a>');
//-->
</script>
<noscript>(画像などを設置)</noscript>

このメールエンティティ化したリンクをクリックしたとき、メールタイトルやメール本文などをどうするか?というと、こうする

<script type="text/javascript">
<!--
function converter(M){
var str="", str_as="";
for(var i=0;i<M.length;i++){
str_as = M.charCodeAt(i);
str += String.fromCharCode(str_as + 1);
}
return str;
}
function mail_to(k_1,k_2)
{eval(String.fromCharCode(108,111,99,97,116,105,111,110,46,104,114,101,102,32,
61,32,39,109,97,105,108,116,111,58) 
+ escape(k_1) + 
converter(String.fromCharCode(117,104,107,107,96,102,100,111,113,110,108,63,102,108,96,104,107,45,98,110,108,
62,114,116,97,105,100,98,115,60)) 
+ escape(k_2) + "メールタイトル&body=下記項目を入力してください%0D%0A%0D%0A名前→%0D%0A年齢→%0D%0A住所→%0D%0A電話番号→%0D%0A身長→%0D%0A体重→%0D%0A%0D%0A本文本文本文本文本文本文%0D%0A'");} 
document.write('<a href=JavaScript:mail_to("","") class="btn btn-primary btn-block btn-entry">メール送信する<\/a>');
//-->
</script>
<a href="JavaScript:mail_to(&quot;&quot;,&quot;&quot;)" class="btn btn-primary btn-block btn-entry">メール送信する</a>

body内にある

%0D%0A

は改行できる。メールリンクはスマホからだと送信する方も、受信して返信する方も、楽である。サーバー上にプログラムを置く必要もない。

google スプレッドシートを利用してJSONをAPIで発行

基本はJavascript。

doOutput(e)関数で吐き出すらしい。これをAPIにすると、超便利である。

まず、
var summaryData = sh.getDataRange().getValues();
がミソ。これで一度すべてのシート内容を読む。シートが巨大な時はこれをつかう。早いから。

リターンで返す時は、
return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
などなど。単純に文字列を返してもだめっすよ、怒られます。

function doGet(e){ 
  var json = myFunction();
  Logger.log(JSON.stringify(json));
  return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
}

function doPost(e) {
  var json = myFunction();
  Logger.log(JSON.stringify(json));  
  return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
}

function myFunction() {
  
  var url = 'https://docs.google.com/spreadsheets/xxxxxxxxxxxxxxxxxxxxxxxxxx';
  var bk = SpreadsheetApp.openByUrl(url);
 var sh = bk.getSheetByName("food_drink");
  
  // 最後行を取得
  var lastRow = sh.getLastRow() - 1;
  // 最後列を取得
  var lastColumn = sh.getLastColumn();
  
  var list = [];
  var obj = {};
  var objShou = {};
  var objChuu = {};
  
 var summaryData = sh.getDataRange().getValues();
 
 Logger.log(lastRow);
  
  for (var y = 1; y <= lastRow; y++) {
  
    // 名前取得
  var obj1 = {};
  obj1.name = summaryData[y][4];
  obj1.money = summaryData[y][5];
  obj1.iconImageUrl = summaryData[y][6];
  obj1.photoImageUrl = summaryData[y][7];
  obj1.id = summaryData[y][0];
 
   list.push(obj1);
   
   // 小カテゴリー、次に変化があればオブジェクトへいれる
    if (y < lastRow) {
   
     var dy1 = summaryData[y][3];
     var dy2 = summaryData[y+1][3];
     if (dy1 != dy2) {
       objShou[dy1] = list;
       list = [];
     }
   
   } else {
   
     var dy1 = summaryData[y][3];
     objShou[dy1] = list;
     list = [];
   
   }
   
   // 中カテゴリー、次に変化があればオブジェクトへいれる
   if (y < lastRow) {
   
     var cy1 = summaryData[y][2];
     var cy2 = summaryData[y+1][2];
     if (cy1 != cy2) {
       objChuu[cy1] = objShou;
       objShou = {};
     }
   
   } else {
   
     var cy1 = summaryData[y][2];
       objChuu[cy1] = objShou;
       objShou = {};
   
   }
  
  }
  
  return objChuu;
  
}