簡體   English   中英

當在該行中輸入電子郵件地址時,如何讓 Google 表格通過電子郵件發送該行?

[英]How can I have Google Sheets email a row when an email address in entered into that row?

我是 Javascript 的新手,但我能夠修改我在網上找到的一些腳本,以便將一行通過電子郵件發送到該行 B 列中的地址。 有三個地方我完全卡住了:

  1. 如何在更新 B 列時觸發腳本運行?
  2. 在我的代碼的第二行中,我將行號硬編碼為變量 dataRow。 如何從電子表格中獲取更新的行?
  3. HTML 在某些情況下會呈現,但在其他情況下不會呈現。 第 22 行中的 td 寬度不起作用,第 46 行和第 47 行中的任何 html 格式都不起作用。我嘗試了幾種技術,但沒有任何效果。

謝謝!

 function sendEmails() { var sheet = SpreadsheetApp.getActiveSheet(); var dataRow = 232; //updated row in spreadhseet var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var data = sh.getRange("E:T").getValues(); var TABLEFORMAT = 'cellspacing="2" cellpadding="2" dir="ltr" border="1" style="table-layout:fixed;font-size:10pt;font-family:arial,sans,sans-serif;border-collapse:collapse;border:1px solid #ccc;font-weight:normal;color:black;background-color:white;text-align:center;text-decoration:none;font-style:normal;"' var htmltable = ['<table ' + TABLEFORMAT +'>']; row = 0; htmltable += '<tr>'; for (col = 0 ;col<data[row].length; col++){ if (data[row][col] === "" || 0) {htmltable += '<td>' + 'None' + '</td>';} else if (row === 0) { htmltable += '<th>' + data[row][col] + '</th>'; } else if (col===10){htmltable += '<td>' + data[row][col] + '</td>';} else {htmltable += '<td width=400px" style="width:400px; background-color:yellow;">' + data[row][col] + '</td>';} } htmltable += '</tr>'; row = dataRow - 1; htmltable += '<tr>'; for (col = 0 ;col<16; col++){ if (data[row][col] === "" || 0) {htmltable += '<td>' + 'None' + '</td>';} else {htmltable += '<td>' + data[row][col] + '</td>';} } htmltable += '</tr>'; htmltable += '</table>'; var dataRange = sheet.getRange(dataRow, 1, 1, 19) var data = dataRange.getValues(); for (i in data) { var row = data[i]; var emailAddress = row[1]; var ccAddress = row[2]; var signature = '<span style="font-family:"Arial",sans-serif">Best</span></br>Adam Schwartz </span> </br><span style="font-size:10.0pt;font-family:"Arial",sans-serif;color:#48B8DD"> <stong> MANAGER OF ESCALATIONS - RESIDENTIAL</stong></span></br><span style="font-family:"Arial",sans-serif">SMS ASSIST</span><span style="font-size:9.0pt;font-family:"Arial",sans-serif;color:#6C6C6C"> 875 N. Michigan Ave. | Suite 2800 | Chicago, IL 60611 </span>'; var message = "Hello " + row[4] + "," + '</br></br>' +"One of your escalation model tasks was randomly selected for QA last week. Your scores are below, along with my notes." + '</br></br>' + htmltable + '</br></br>' + signature; // Assemble the body text var subject = "Preventive Escalation Model QA " + row[19]; MailApp.sendEmail(emailAddress, subject, message, {htmlBody:message,cc:ccAddress}); } }

首先,您需要一個 onEdit 觸發器,以便在每次編輯電子表格 B 列時觸發該函數。 另外,因為您要發送電子郵件,所以一個簡單的觸發器是不夠的(請參閱此處的簡單觸發器限制),您需要安裝一個觸發器。 您可以手動或以編程方式執行此操作 在這里,我提供了以編程方式安裝編輯觸發器的代碼。 您必須運行此函數一次:

function createEditTrigger() {
  var ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('sendEmails')
      .forSpreadsheet(ss)
      .onEdit()
      .create();
}

這將使每次編輯電子表格時都運行sendEmails 您必須放置一個條件來檢查編輯的范圍是否在 B 列中。如果您使用Event 對象,則可以這樣做,該對象將由sendEmails作為參數接收,並且包含有關觸發觸發器的上下文的信息.

假設,像往常一樣,事件對象被稱為e 您可以通過執行e.range訪問編輯過的范圍。 如果您執行e.range.getColumn() ,您可以知道被編輯的列。 此外,如果您執行e.range.getRow() (這是您的第二個問題),您可以知道哪一行被更新。

綜上所述,您必須按以下方式修改sendEmails函數。 你必須改變這個:

function sendEmails() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var dataRow = 232; //updated row in spreadhseet
    var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // Rest of the code
}

對此:

function sendEmails(e) {
  var range;
  if (!e) range = SpreadsheetApp.getActiveRange(); 
  else range = e.range; // Edited range
  var sh = range.getSheet(); // Edited sheet
  var dataRow = range.getRow(); // Edited row index
  var column = range.getColumn(); // Edited column index
  var yourSheetName = "Sheet1"; // Please change accordingly
  // Check that edited sheet is the one you want to track change from
  // and that edited column is B (index 2):
  if (sh.getName() == yourSheetName && column == 2) {
    // Rest of the code
  }
}

e作為函數的參數編寫非常重要,否則代碼將不知道e是什么。 另請記住,這僅在用戶手動編輯電子表格時才有效,而不是通過腳本以編程方式編輯)。

此外,在此示例中,您要跟蹤更改的工作表稱為Sheet1 ,如果不是這種情況,請在代碼中更改它。

最后,關於 HTML,我認為您在幾個地方缺少一些引號,這就是它無法正常工作的原因。 在這一行中,例如:

'<td width=400px" style="width:400px; background-color:yellow;">'

400px缺少第一個 ",它應該是width="400px"

我看到這一行發生了類似的事情:

'<span style="font-family:"Arial",sans-serif">Best</span> // ...

在這里,您應該使用轉義字符 ( \\" ),否則,當您想打開一個新的引用塊時,腳本認為您想關閉一個引用塊。您應該執行以下操作:

'<span style="font-family:\"Arial\",sans-serif">Best</span> // ...

我希望這有任何幫助。

我可以幫助解決 1 和 2。3 是電子郵件格式問題,這通常很痛苦。

  1. 有一個onEdit(e)函數將一個對象傳遞給函數。 例如,當我編輯單元格 A7 以僅包含字母 a 時,對象 (e) 包含以下內容:

    { "range": { "columnStart": 1, "rowStart": 7, "rowEnd": 7, "columnEnd": 1 }, "value": "a" }

在 onEdit 函數中,您可以檢查(range.columnStart <= 2 && range.columnEnd >= 2)對列 B 的更改

  1. 您可以使用上述對象中的行值。 否則,您可以使用var lastRow = sh.getLastRow()找到工作表中的最后一行

暫無
暫無

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

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