簡體   English   中英

Google 表格,如何向每位客戶發送帶有附件的電子郵件

[英]Google Sheets, how to send email with attachment to every customer

我有一張工作表,帶有一些選項卡,在一個選項卡中我為我的客戶做聲明,在那里我在 B2 中選擇一個客戶並使用查詢公式我得到所需的數據,之后我有一個腳本來首先隱藏空白行然后發送帶有 pdf 作為附件的電子郵件,我只在需要發送該電子郵件時才做細化。

在此處輸入圖片說明

這是我的腳本:

  function HideEdoCta() {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getSheetByName('Edo Cta');
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange(1, 4, lastRow, 1);
  var data = range.getValues();

  //Rows
  for (var i = 0; i < data.length; i++) {
    if (data[i][0] == 1) {
      sheet.hideRows(i + 1)
    }
  }
  sheet.hideColumns(4, 1)

}

function UnHideEdoCta() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Edo Cta');
  sheet.unhideRow(sheet.getDataRange());
}


function MailEdoCta(email, subject, body, sheetName) {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getSheetByName('Edo Cta');
  var valueToCheck = sheet.getRange('C1').getValue();

  if (valueToCheck == true && casa != '') {

    HideEdoCta()

    SpreadsheetApp.flush()

    var email = sheet.getRange('D1').getValue();  // Enter the required email address here
    var casa = sheet.getRange('B2').getValue();
    var subject = 'Estado de Cuenta Sky';

    var body =
      "Hola, <strong>" + casa + "</strong><br><br>" +
      "xxx.<br>" +

      "-- <br>" +
      "<strong>xxx</strong><br>"
      ;

    // Base URL
    var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ss.getId());

    var url_ext = 'exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
      + '&size=letter'                          // paper size legal / letter / A4
      + '&portrait=true'                        // orientation, false for landscape
      + '&scale=1'                              // 1= Normal 100% / 2= Fit to width / 3= Fit to height / 4= Fit to Page
      + '&fitw=true&source=labnol'              // fit to page width, false for actual size
      + '&sheetnames=false&printtitle=false'    // hide optional headers and footers
      + '&pagenumbers=true&gridlines=false'     // hide page numbers and gridlines
      + '&fzr=false'                            // do not repeat row headers (frozen rows) on each page
      + '&gid=';                                // the sheet's Id

    var token = ScriptApp.getOAuthToken();

    var response = UrlFetchApp.fetch(url + url_ext + sheet.getSheetId(), {
      headers: {
        'Authorization': 'Bearer ' + token
      }
    }).getBlob().setName(sheet.getName() + ".pdf");

    // Uncomment the line below to save the PDF to the root of your drive. 
    //  var newFile = DriveApp.createFile(response).setName(sheet.getName() + ".pdf")


    GmailApp.sendEmail(email, subject, "",
      { name: 'xxx', htmlBody: body, attachments: [response] }
    );

    SpreadsheetApp.flush()
    UnHideEdoCta()

    sheet.getRange('C1').setValue(false)
    sheet.getRange('B2').clearContent()
  }
  else {
    sheet.getRange('C1').setValue(false)
  }

}

在這個腳本中,我有一個驗證,如果在 B2 中選擇了一個客戶並且 C1 為真,則發送電子郵件,因為觸發器設置為每分鍾運行一次。

現在我需要的是每月 5 號自動向所有客戶發送相同的電子郵件(我只有 24 個客戶)

我怎樣才能在不一一選擇的情況下使這成為可能?

有什么幫助嗎?

這是帶有示例數據的示例表

試試這個

function mailing() {
  var doc = SpreadsheetApp.getActive();
  var sh = SpreadsheetApp.getActiveSheet();
  var data = doc.getRange('listOfCustomers').getValues();
  for (var i = 0; i < data.length; i++) {
    if (data[i][1]) {
      sh.getRange('B2').setValue(data[i][0]); 
      SpreadsheetApp.flush();
      Utilities.sleep(1000);
    }
  }
};

您的電子表格副本將不勝感激以進行測試。

回應你上面的評論:

這是讀取信息電子表格並調用電子郵件函數以及標識模板和其他重要信息的對象的基本腳本。

function sendEmails() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Emails');
  const [hA, ...dt] = sh.getDataRange().getValues();
  const vs = dt.filter(r => r[0] && r[1] && r[2] && r[3] && r[4] == 'Send' && r[5]);
  const idx = {};
  hA.forEach((h, i) => { idx[h] = i; });
  vs.forEach(function (r) {
    let obj = { index: idx, row: r }
    this[r[5]](obj);//This executes the function named in r[5] and passes it obj
  });
}

這是發送電子郵件或創建草稿的功能之一:

function sendEmails103(obj) {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('libImages');
  const [hA, ...dt] = sh.getDataRange().getValues();
  let idx = {};
  hA.forEach((h, i) => idx[h] = i);
  let imgObj = {};
  vs = dt.filter(r => r[idx['filename']] == obj.row[obj.index['htmlFile']])
  vs.forEach((r, i) => {
    let params = { muteHttpExceptions: true, headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() } };
    let aurl = "https://photoslibrary.googleapis.com/v1/mediaItems/" + r[idx['mediaItemId']]
    let resp = JSON.parse(UrlFetchApp.fetch(aurl, params).getContentText());
    let burl = `${resp.baseUrl}=w${r[idx['maxwidth']]}-h${r[idx['maxheight']]}`
    imgObj[r[idx['Key']]] = UrlFetchApp.fetch(burl).getBlob();
  });
  let htmlTemplate = HtmlService.createTemplateFromFile(obj.row[obj.index['htmlFile']]);
  let html = htmlTemplate.evaluate().getContent();
  if (html) {
    if (obj.row[obj.index['operation']] == 'Create Draft') {
      GmailApp.createDraft(obj.row[obj.index['Recipients']], obj.row[obj.index['Subject']], '', { htmlBody: html, inlineImages: imgObj, replyTo: obj.row[obj.index['replyTo']] });
    } else {
      GmailApp.sendEmail(obj.row[obj.index['Recipients']],obj.row[obj.index['Subject']],'',{htmlBody:html,inlineImages:imgObj,replyTo: obj.row[obj.index['replyTo']]});
    }
  }
}

這可能並不適合所有人,但我喜歡有更多的空間來定制我的信件,並且作為一名 Web 開發人員很長一段時間我很習慣用 html 撰寫信件,這可能不是每個人都如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM