【问题标题】:Building a Sheets Emailer建立一个表格电子邮件
【发布时间】:2016-02-24 16:51:23
【问题描述】:

想法:

  • 用户从打开 Google 边栏的菜单中选择“电子邮件”。
  • 它提示用户使用单选按钮选择他们的外地办事处位置,并使用文本区域为电子邮件正文添加他们的附加消息
  • 用户点击提交,“FFO_Email”功能运行

“FFO_Email”函数将执行以下操作

  • 根据无线电选择确定外地办事处位置
  • 根据外地办事处位置 ('FFO-IS'!A3:A12) 和“FFO-IS”表右侧的电子邮件 ('FFO-IS'!B3:H12) 确定电子邮件列表
  • 创建电子邮件主题
  • 创建电子邮件正文(将合并来自侧边栏文本区域的附加消息
  • 最后向个人发送电子邮件并在侧边栏中显示电子邮件已成功发送的消息

我遇到的问题

选定的电台外地办事处位置和附加消息未传递到 FFO_Email.gs 函数。因此不会将电子邮件发送给个人。

可以在这里找到工作表

https://docs.google.com/a/cougars.ccis.edu/spreadsheets/d/1PK18AXMlfC2reKRP7IJWHRT9TEnDzfWa3g-uavgsxUk/edit?usp=sharing

FFO_email.html

<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
<!DOCTYPE html>
<html>

<head>
  <base target="_top">

  <script>
    function onSuccess(fieldOffice, AdditionalMessage) {
      var div = document.getElementById('fieldOfficeFFO');
      div.innerHTML = 'Email for ' + fieldOffice + ' has been sent successfully.';
    }
    google.script.run.withSuccessHandler(onSuccess)
      .FFO_Email();
  </script>

</head>

<body>

  <form id=fieldOfficeFFO>

    <fieldset style="background-color:LightGray;width:250px">

      <div>
        <label for="Field Office Select">Please select your field office below.</label>
      </div>

      <div>
        <input type="radio" name="fieldOfficeFFO" id="fieldOfficeFFO" value="ARK_E_TEXAS">
        <label for="ARK_E_TEXAS">ARK_E_TEXAS</label>
      </div>
      <div>
        <input type="radio" name="fieldOfficeFFO" id="fieldOfficeFFO" value="BORDER_EAST">
        <label for="BORDER_EAST">BORDER_EAST</label>
      </div>
      <div>
        <input type="radio" name="fieldOfficeFFO" id="fieldOfficeFFO" value="BORDER_WEST">
        <label for="BORDER_WEST">BORDER_WEST</label>
      </div>
      <div>
        <input type="radio" name="fieldOfficeFFO" id="fieldOfficeFFO" value="CENTRAL_TEXAS">
        <label for="CENTRAL_TEXAS">CENTRAL_TEXAS</label>
      </div>
      <div>
        <input type="radio" name="fieldOfficeFFO" id="fieldOfficeFFO" value="DALLAS">
        <label for="DALLAS">DALLAS</label>
      </div>
      <div>
        <input type="radio" name="fieldOfficeFFO" id="fieldOfficeFFO" value="FORT_WORTH">
        <label for="FORT_WORTH">FORT_WORTH</label>
      </div>
      <div>
        <input type="radio" name="fieldOfficeFFO" id="fieldOfficeFFO" value="GULF_COAST">
        <label for="GULF_COAST">GULF_COAST</label>
      </div>
      <div>
        <input type="radio" name="fieldOfficeFFO" id="fieldOfficeFFO" value="LOUISIANA">
        <label for="LOUISIANA">LOUISIANA</label>
      </div>
      <div>
        <input type="radio" name="fieldOfficeFFO" id="fieldOfficeFFO" value="NEW_MEXICO">
        <label for="NEW_MEXICO">NEW_MEXICO</label>
      </div>
      <div>
        <input type="radio" name="fieldOfficeFFO" id="fieldOfficeFFO" value="OKLAHOMA">
        <label for="OKLAHOMA">OKLAHOMA</label>
      </div>
    </fieldset>

    <br>
    <br>

    <fieldset>
      <div class="form-group">
        <label for="AdditionalMessage">Additional Message</label>
        <textarea id="AdditionalMessage" rows="3" style="width:250px"></textarea>
      </div>
    </fieldset>

  </form>

  <div class="block">
    <button class="blue" onclick="onSuccess(fieldOfficeFFO,AdditionalMessage)">Submit</button>
    <button onclick="google.script.host.close()">Close</button>
  </div>

</body>

</html>

FFO_Email.gs

function FFO_Email(fieldOfficeFFO, AdditionalMessage) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('FFO-IS')
  var firstRow = 3;
  var lastRow = 10;
  var dataRange = sheet.getRange(firstRow, 1, lastRow, 8);
  var myDate = new Date();
  var hrs = myDate.getHours();

  //Determines the row the Field Office is in
  for (var j = 0; j < dataRange.length; j++) {
    if (dataRange[j][0] == fieldOfficeFFO) {
      Logger.log((j + 1))
      return j + 1;
    }
  }

  //Create the greeting based on the time of day
  var greeting;

  if (hrs < 12)
    greeting = 'Good Morning';
  else if (hrs >= 12 && hrs <= 17)
    greeting = 'Good Afternoon';
  else if (hrs >= 17 && hrs <= 24)
    greeting = 'Good Evening';


  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (i in data) {
    var row = data[i];

    var field_Office = fieldOfficeFFO;
    var PT_Director = dataRange.getValues(j, 2);
    var PT_Manager = dataRange.getValues(j, 3);
    var PT_Management_Specialist = dataRange.getValues(j, 4);
    var Area_Supervisory_AM = dataRange.getValues(j, 5);
    var Area_AM = dataRange.getValues(j, 6);
    var SC_Senior_Property_Manager = dataRange.getValues(j, 7);
    var AMS = dataRange.getValues(j, 8);
    var email_Subject = field_Office + " FFO / Income Statement Report is ready for viewing";
    var message_Body = greeting + "," +
      "<br> <br>" +
      "The " + field_Office + " <b>FFO / Income Statement Report is ready for viewing in</b> the <i>AMS Standard Reports - R07 Google Folder</i>" +
      " located at https://drive.google.com/drive/u/0/folders/0Bx1aKS2V9K-kb0tNLXFfbGtmalE" +
      "<br> <br>" +
      "<br> <br>" +
      //Additional Message from html side added here
      AdditionalMessage +
      "<br> <br>" +
      "Thank you." +
      "<br> <br>" +
      AMS;


    //Send email
    MailApp.sendEmail({
      to: SC_Senior_Property_Manager + "," + Area_AM + "," + AMS,
      cc: PT_Director + "," + PT_Manager + "," + PT_Management_Specialist + "," + Area_Supervisory_AM,
      replyTo: AMS,
      subject: email_Subject,
      htmlBody: message_Body
    });
    return fieldOfficeFFO
    SpreadsheetApp.flush();
    Utilities.sleep(1000);
  }
}

【问题讨论】:

    标签: javascript html email google-apps-script google-sheets


    【解决方案1】:

    同一组中的无线电输入不能具有相同的id=。 如果您想对它们进行分组,则可以为它们提供相同的名称属性。 Textarea 根本没有 name= 属性。

    【讨论】:

      【解决方案2】:

      需要进行很多更改:

      我会为提交创建一个新函数,我称之为sendInputInfo()

      脚本标签:

      <script>
        function sendInputInfo() {
          console.log('sendInputInfo ran!');//Open browsers console to see print out
          //Get the form information to be sent
          var theFormElement = document.getElementById('fieldOfficeFFO');
      
          google.script.run.withSuccessHandler(onSuccess)
            .FFO_Email(theFormElement);
        };
      
        function onSuccess(fieldOffice, AdditionalMessage) {
          div.innerHTML = 'Email for ' + fieldOffice + ' has been sent successfully.';
        };
      </script>
      

      更改onclick 属性:

      <button class="blue" onclick="sendInputInfo()">Submit</button>
      

      请注意,括号中没有值被发送到函数。那是不需要的。正在sendInputInfo() 函数中检索表单。

      目前,代码没有向服务器传递任何信息。服务端函数的括号内什么都没有:

      目前:

      .FFO_Email();
      

      括号里应该有东西:

      .FFO_Email(theFormElement);
      

      您的.gs 代码的括号中有两个参数。如果是表单对象,Apps 脚本将只接受服务器端的一个输入。因此,您需要将函数更改为:

      function FFO_Email(theFormObject) {
        Logger.log('theFormObject: ' + theFormObject);//Should be an object
        Logger.log('theFormObject.fieldOfficeFFO: ' + theFormObject.fieldOfficeFFO);
      
        for (var key in theFormObject) {//Loop through all the data in the form
          Logger.log('key: ' + key);
          Logger.log('value: ' + theFormObject[key]);
        };
      

      【讨论】:

      • 我阅读了您的答案并进行了更改,但仍然没有运气。我很好奇所选电台和附加消息从 HTML 端传递到 Google Apps 脚本端的位置
      • 您需要从头到尾调试您的代码。你需要弄清楚有多少代码在工作,以及它在哪里停止工作。超出其不工作的一切都不能被信任。请参阅最后的更新答案。您需要确定服务器正在接收什么数据。 Bryan P 对id's 的看法是正确的。删除所有id="fieldOfficeFFO" 属性,它们没用。 Apps 脚本将不允许允许在表单对象中传递 id,只允许传递名称。
      • 我已按照您的建议进行了更改,并详细了解了您所做的更改。该脚本现在会将电子邮件发送到个人列表,但表单并未说明电子邮件已发送。此外,我进行了更多更改,这些更改不再符合我最初发布的代码,但仍在寻求相同的结果。我应该开始一个新问题还是应该更新我的问题?
      猜你喜欢
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 2014-09-14
      • 1970-01-01
      • 2017-10-19
      • 2021-08-04
      相关资源
      最近更新 更多