1

GoogleAppsScriptでメールマージプロジェクトを変更しています。私が直面している問題は、メール本文にインライン画像を表示する方法です。現在、元のメールテンプレートに存在するすべてのインライン画像は、GmailApp.sendEmail()が呼び出された後に添付ファイルとして表示されます。

私の推測では、imgVars配列を次のようなJSONオブジェクトに変換する方法を見つければ、インライン画像を表示できると思います(GASドキュメントの例から取得)。

  MailApp.sendEmail(
    "sg.appsscript@gmail.com",
    "Logos",
    "", 
    { htmlBody: 
      "inline Google Logo<img src='cid:googleLogo'> images! <br/> inline YouTube Logo   <img src='cid:youTubeLogo'>",
     inlineImages: 
     { googleLogo: googleLogoBlob,
       youTubeLogo: youtTubeLogoBlob
     }
    }
  );

だから私がやろうとしているのは、次のような配列を変換することです。

var array = { item1, item2, item3 };

このようなJSONオブジェクトへ:

var json = { item1Name: item1,
             item2Name: item2,
             item3Name: item3
           };

これが私が取り組んでいるメールマージからのコードスニペットです:

  //---------------------------------------------------------------
  // If there are inline images in the body of the email
  // Find them and store them in an array, imgVars
  //---------------------------------------------------------------
  if(emailTemplate.search(/<\img/ != -1)) {  
  var inlineImages = {};

  // Extract all images from the email body
  var imgVars = emailTemplate.match(/<img[^>]+>/g);

  // For each image, extract its respective title attribute
  for (i in imgVars) {
    var title = imgVars[i].match(/title="([^\"]+\")/);
    if (title != null) {
    title = title[1].substr(0, title[1].length-1);
    for (j in attachments) {
       if (attachments[j].getName() == title) {
        inlineImages[title] = attachments[j].copyBlob();
        attachments.splice(j,1);
       }
    }
    var newImg = imgVars[i].replace(/src="[^\"]+\"/,"src=\"cid:"+title+"\"");
    emailTemplate = emailTemplate.replace(imgVars[i],newImg);
    }
  }
 }

 objects = getRowsData(dataSheet, dataRange);
 for (var i = 0; i < objects.length; ++i) {   
   var rowData = objects[i];
   if(rowData.emailSent != "EMAIL_SENT") {

     // Replace markers (for instance ${"First Name"}) with the 
     // corresponding value in a row object (for instance rowData.firstName).

     var emailText = fillInTemplateFromObject(emailTemplate, rowData);     
     var emailSubject = fillInTemplateFromObject(selectedTemplate.getSubject(), rowData);

     GmailApp.sendEmail(rowData.emailAddress, emailSubject, emailText,
                      {name: e.parameter.name, 
                       attachments: attachments, 
                       htmlBody: emailText, 
                       cc: cc, 
                       bcc: bcc, 
                       inlineImages: inlineImages});      
4

3 に答える 3

1

下書きや定型文からの 100% の忠実度は完全に実行可能です。このコード スニペットは、インライン イメージ (埋め込み BLOB と外部参照の両方) と添付ファイルもサポートするように拡張した、動作中の差し込み印刷からのものです。

...
//selectedTemplate is a Gmail Message (draft/canned response) 
var emailTemplate = selectedTemplate.getBody(); 
var attachments = selectedTemplate.getAttachments();
var to = selectedTemplate.getTo();
var cc = selectedTemplate.getCc();
var bcc = Session.getActiveUser().getEmail();

if(emailTemplate.search(/<\img/ != -1)){  
    var inlineImages = {};
    var imgVars = emailTemplate.match(/<img[^>]+>/g);
    for(i in imgVars){
      var title = imgVars[i].match(/title="([^\"]+\")/);
      if (title) {
        title = title[1].substr(0, title[1].length-1);
        var titleEncoded = title.replace(/ /g,"-");
        for(j in attachments){
          if(attachments[j].getName() == title){
            inlineImages[titleEncoded] = attachments[j].copyBlob().setName(titleEncoded);
            attachments.splice(j,1);
          }
        }
        var newImg = imgVars[i].replace(/src="[^\"]+\"/,"src=\"cid:"+titleEncoded+"\"");
        emailTemplate = emailTemplate.replace(imgVars[i],newImg);
      }
    }
  }
...
GmailApp.sendEmail(....,
                  {attachments: attachments, ...,
                   inlineImages: inlineImages});

私はこれを、毎日、一日中、ドメイン ユーザーと連携させています。お役に立てれば。

于 2012-08-02T01:31:23.707 に答える
1

いくつかのコメント:

> var array = { item1, item2, item3 };

これは構文的に正しくありません。配列リテラルは次のようにする必要があります。

var array = [ item1, item2, item3 ];

[...]

> if (emailTemplate.search(/<\img/ != -1)) {

前のバックスラッシュimgは不要です。パターンは末尾にスペースがあり、大文字と小文字を区別しないほうがよいでしょう (HTML では大文字と小文字が区別されず、通常はタグ名が大文字で表示されるため)。/<img /i

> var imgVars = emailTemplate.match(/<img[^>]+>/g);

正規表現を使用して HTML を解析することはお勧めできません。HTML をドキュメント フラグメントに変換して処理する方がはるかに優れています。

>  var imgVars = emailTemplate.match(/<img[^>]+>/g);

String.prototype.matchは配列を返すことに注意してください。

> for (i in imgVars) {

配列で for..in を使用することは、メンバーが特定の順序で返されない場合があり (ブラウザーによって異なる場合があります)、 for..in が配列のすべての列挙可能なプロパティを返すなど、さまざまな理由で推奨されません。配列とそのため、「シム」または「モンキーパッチ」によって変更され[[Prototype]]たブラウザーを使用している場合、それらのプロパティも列挙されるため、次のようになります。Array.prototype

> var title = imgVars[i].match(/title="([^\"]+\")/);

値が関数への参照であるプロパティに対してmatchを呼び出そうとしているため、エラーがスローされる可能性があります。少なくともhasOwnPropertyテストを含める必要がありますが、単純な for ループを使用することをお勧めします。

> for (j in attachments) {

attachmentsも配列のようです。上記と同じ理由で、ここでも単純な for ループを使用します。また、 for..in (予期しない順序でプロパティにアクセスする可能性があります) をspliceと共に使用することもお勧めできません。これは、特定の順序を予期していると推測します。一部のブラウザーでは、 for..in は、番号順ではなく、配列に追加された順序で配列メンバーにアクセスすることに注意してください。他のブラウザは、常に特定の順序で数値プロパティにアクセスしますが、他のブラウザにはアクセスしません。

HTML がドキュメント フラグメントに変換された場合、これの多くは非常に単純になります。その後、DOM メソッドを使用して img 要素を抽出し、それらのプロパティにアクセスしてオブジェクトを構築できます。その後、必要に応じて、ネイティブ メソッドを使用してオブジェクトを JSON に変換できます。

于 2012-08-01T01:02:42.463 に答える
0

残念ながら、インライン画像にはタイトルがありません。alt=Inline Image 1 がありますが、これは添付ファイルの名前と同じではありません。img タグの項目は alt と src だけです。

それを考えると、最初のインライン画像が最初の添付ファイルになることを期待する以外に、インライン画像を添付ファイルに結び付ける方法はないようです。

Gmail のウェブ インターフェースを使用して下書きを作成し、「画像の挿入」ラボで画像を挿入していることに注意してください。

于 2012-08-03T22:34:39.157 に答える