Google apps script 我如何加上一句;发送电子邮件;谷歌工作表每行的按钮?

Google apps script 我如何加上一句;发送电子邮件;谷歌工作表每行的按钮?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个谷歌表,有4列输入,用于写电子邮件 我想(快速)为每一行创建一个按钮(都添加在D列中),该按钮将仅利用按钮所在行的信息发送电子邮件 我该怎么做 如何在每行中快速添加多个外观相同的按钮,但每个按钮只能触发使用自己行中的信息发送电子邮件? 如何编写这样的脚本函数,使其将从中获取数据的行更改为仅为“当前”行? 到目前为止,我所尝试的: 我使用Insert>Drawing将一个按钮添加到一行,并为其指定了自定义函数的名称(sendEmail) 我的剧本: function sen

我有一个谷歌表,有4列输入,用于写电子邮件

我想(快速)为每一行创建一个按钮(都添加在D列中),该按钮将仅利用按钮所在行的信息发送电子邮件

我该怎么做

  • 如何在每行中快速添加多个外观相同的按钮,但每个按钮只能触发使用自己行中的信息发送电子邮件?

  • 如何编写这样的脚本函数,使其将从中获取数据的行更改为仅为“当前”行?


到目前为止,我所尝试的:

我使用Insert>Drawing将一个按钮添加到一行,并为其指定了自定义函数的名称(
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
    是访问特定列的最佳方式吗

  • 如何添加代码以缩小脚本范围,使其仅处理其指定按钮所在的行?


不能使用事件触发器,因为单击图像不会从工作表中获取任何数据。更简单的方法是以行中的活动单元格为目标,并使用应用程序脚本选择正确的范围

函数sendmail(){ //为函数定义一对常量 const sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const ui=SpreadsheetApp.getUi(); //确保所选行包含文本 if(sheet.getActiveCell().isBlank()){ ui.alert(“请选择包含消息的行”); 返回; } //如果有效,则获取正确的数据行。 var row=sheet.getActiveCell().getRow(); //获取该行的范围 var rowRange=sheet.getRange(行,1,1,3).getValues(); //生成要在MailApp中使用的对象 var地址=行范围[0][0]; var sub=行范围[0][1]; var body=行范围[0][2]; var msg=“地址:”+Address+“\n对象:”+subj+“\n正文:”+body; //这里仅作说明 ui.alert(消息,ui.ButtonSet.OK) //MailApp.sendmail(地址、主题、正文); //在第4列中设置发送状态 表.getRange(第4行).setValue(“已发送”); } 这样,您可以在工作表中有一个运行单个函数的图像。为每一行添加图像会很麻烦。这是轻量级和有效的


在实际发送消息之前,您可能需要考虑其他一些数据验证步骤,但这应该是您开始的步骤。

以下是一种获取所需内容的方法。每行上都有一个发送电子邮件按钮,其中包含该行的相关数据

代码.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);
}
函数getEmails() { var ss=SpreadsheetApp.getActive(); var sh=ss.getActiveSheet(); var rg=sh.getDataRange(); var vA=rg.getValues(); var br='
'; var s=''; s+=Utilities.formatString(“%s%s%s”,vA[0][0],vA[0][1],vA[0][2]);
对于(var i=1;iso)这是否会一次发送所有电子邮件(即,每次只为所有行运行单个函数)?这会根据您的问题为单个选定行发送电子邮件。不过,您可以重写循环,为多个选定行发送单独的消息。最终需要测试这一点。效果非常好!非常感谢您提供的优雅而简单的解决方案。我可以问一个后续请求吗?(如果您愿意,可以作为您答案的更新).如何在代码末尾添加一点内容,使第五列包含“已发送电子邮件”成功发送该行的电子邮件后?在末尾添加一行以设置第4列中的状态。您也可以使用此单元格中的值来防止意外发送。按原样,它将发送另一封电子邮件。谢谢。您可以解释其中的一些操作吗?您有任何具体问题吗?
<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>