2017-08-26 57 views
1

我有一個輸入的4列的谷歌片,寫一封電子郵件如何爲Google表格的每一行添加「發送電子郵件」按鈕?

enter image description here

我想(快速)創建於各行的按鈕(所有添加的,比方說,列d)將發送利用信息只有從該按鈕位於的行。

我該怎麼做?

  • 如何快速添加多個相同的美觀的按鈕,以每一行,但以這樣的方式,每個按鈕只觸發發送利用它自己的行信息的電子郵件?

  • 我該如何編寫這樣一個腳本函數,以便它更改從哪個行抓取數據到「當前」行?


我試過到目前爲止:

我添加了一個按鈕,使用插入>繪製單列並賦予它一個自定義函數(sendEmail)的名稱。

我的腳本:

function sendEmail() { 
     var sheet = SpreadsheetApp.getActiveSheet(); 
     var email = e.values[0]; 
     var subject = e.values[1]; 
     var message = e.values[2]; 
     MailApp.sendEmail(email, subject, message) 
    } 
  • e.values訪問特定列的最佳方式?

  • 如何添加代碼以縮小腳本以僅處理指定按鈕所在的行?

回答

2

您不能使用事件觸發器,因爲單擊圖像不會從工作表中獲取任何數據。更簡單的方法是定位行中的活動單元格,並使用Apps腳本選擇正確的範圍。

function sendEmail() { 
    // define a couple constants for the function 
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    const ui = SpreadsheetApp.getUi(); 

    // Make sure the selected row has text 
    if(sheet.getActiveCell().isBlank()) { 
    ui.alert("Please select a row with a message"); 
    return; 
    } 

    // if valid, get the correct row of data. 
    var row = sheet.getActiveCell().getRow(); 

    // get the range for that row 
    var rowRange = sheet.getRange(row, 1, 1, 3).getValues(); 

    // Build the object to use in MailApp 
    var address = rowRange[0][0]; 
    var subj = rowRange[0][1]; 
    var body = rowRange[0][2]; 

    var msg = "Address: " + address + "\nSubject: " + subj + "\nBody: " + body; 

    // Here for illustration only 
    ui.alert(msg, ui.ButtonSet.OK) 

    // MailApp.sendEmail(address, subj, body); 

    // set the send status in col 4 
    sheet.getRange(row, 4).setValue("Sent"); 
} 

這樣,您可以在運行單個功能的工作表中擁有單個圖像。爲每一行添加圖像會變得麻煩。這是輕量級和有效的。

在實際發送郵件之前,您應該考慮一些其他數據驗證步驟,但這應該讓您開始。

+0

所以將這個只是發送的所有電子郵件一次(即不會只是你的單一功能運行每次都行)? – theforestecologist

+0

這會針對您的問題發送單個選定行的電子郵件。不過,您可以重寫循環以發送多個選定行的單個消息。 – Brian

+0

好極了!這就是我想要的。謝謝! :) – theforestecologist

1

這是一種獲得你所要求的方法。每行的發送電子郵件按鈕以及來自該行的隨附數據。

Code.gs

function getEmails() 
{ 
    var ss=SpreadsheetApp.getActive(); 
    var sh=ss.getActiveSheet(); 
    var rg=sh.getDataRange(); 
    var vA=rg.getValues(); 
    var br='<br />'; 
    var s='<table border="1">'; 
    s+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td><td>&nbsp;</td></tr>', vA[0][0],vA[0][1],vA[0][2]); 
    for(var i=1;i<vA.length;i++) 
    { 
    s+='<tr><td>' + vA[i][0] + '</td><td>' + vA[i][1] + '</td><td>' + vA[i][2] + '</td><td>'; 
    s0=Utilities.formatString('\'%s\',\'%s\',\'%s\'', vA[i][0], vA[i][1], vA[i][2]) 
    s+='<input type="button" value="Email Row ' + Number(i + 1) + '" onClick="sendMyEmail(' + s0 + ');" /></td></tr>'; 
    } 
    s+='</table>'; 
    return s; 
} 

function showMy1Dialog() 
{ 
    var ui=HtmlService.createHtmlOutputFromFile('myemail'); 
    SpreadsheetApp.getUi().showModelessDialog(ui, 'Title') 
} 

function sendEmail(email,subj,body) 
{ 
    SpreadsheetApp.getActive().toast(email + ', ' + subj + ', ' + body); 
    MailApp.sendEmail(email,subj,body); 
    Logger.log('\'%s\',\'%s\',\'%s\'',email,subj,body); 
} 

myemail。HTML

<html> 
    <head> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
    <script> 
    $(function() { 
     google.script.run.withSuccessHandler(displayEmails).getEmails(); 
     });//gets data from spreadsheet on document ready 
    function displayEmails(hl) 
    { 
     document.getElementById('mydiv').innerHTML=hl; 
    } 
    function sendMyEmail(email,subj,body) 
    { 
     google.script.run.sendEmail(email,subj,body); 
    } 
    console.log('My Code'); 
    </script> 
    </head> 
    <body> 
    <div id="mydiv"> 

    </div> 
    <input type="button" value="Close" onclick="google.script.host.close();" /> 
</body> 
</html> 

這裏的對話框是什麼樣子:

enter image description here

+0

謝謝。你能解釋一下這是做什麼的嗎? – theforestecologist

+0

您有任何具體問題嗎? – Cooper

相關問題