2017-08-26 159 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

相关问题