1

在过去的几天里,我一直在四处寻找答案,但似乎找不到对我有意义的答案(请原谅我,我对 GAS 还很陌生)。我正在尝试设置可供大约 12 个用户使用的 Fantasy Golf 草稿表,但其中超过一半的用户没有/不愿意使用 Gmail 地址。访问文件没问题,我遇到的问题是尝试运行脚本,当单击按钮/形状时,它会向轮到它的下一个人发送一封自动电子邮件。脚本的功能是有效的,当它来自我自己或拥有可以授权脚本的谷歌账户的人时。当它是没有谷歌账户的人时,我会遇到麻烦。

我的问题 - 如何将脚本设置为仅从我的电子邮件或工作表/脚本所有者的电子邮件发送 - 无论谁在修改/单击按钮?我看到有关将脚本创建为 web 应用程序的链接,但我很快就迷路了。

这是我的工作表的链接:[ https://docs.google.com/spreadsheets/d/16AppcmrcuhatnzcEs7eIQyD_p1swbRimRZZ4FdbhBKI/edit?usp=sharing][1]

这是我的发送邮件代码:

function sendAlertEmails() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.setActiveSheet(ss.getSheetByName("Send Mails"));
  var sheet = SpreadsheetApp.getActiveSheet();
  var dataRange = sheet.getRange("A2:f2");
  var data = dataRange.getValues();
  for (i in data) {
    var rowData = data[i];
    var emailAddress = rowData[1];
    var recipient = rowData[0];
    var message1 = rowData[2];
    var message2 = rowData[3];
      var message3 = rowData[4];
          var message4 = rowData[5];
       var message = 'Hey ' + recipient + ',\n\n' + message1 + '\n\n' + ' The last player picked was ' + message2 + '\n\n' + message3 +'\n\n' + message4;
    var subject = '*GOLF DRAFT 2018* - YOU ARE ON THE CLOCK';
    MailApp.sendEmail(emailAddress, subject, message);
    var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.setActiveSheet(ss.getSheetByName("DRAFT"));
  }
   
}

任何帮助将不胜感激!

4

3 回答 3

0

不,你不能这样做,因为一个脚本可以与多个用户共享,并且它总是从他们自己的帐户而不是脚本所有者帐户执行,并且脚本使用执行用户的“发件人电子邮件地址”,它是作为安全策略,Google 不允许从其他用户帐户发送电子邮件。

于 2017-12-20T12:28:36.063 回答
0

您可以使用属于您的第二个脚本。从您的第一个脚本向第二个脚本发送获取请求,第二个脚本可以从您的帐户向任何人发送电子邮件。第二个脚本如下所示:

function doGet(e) {     
  var recipient = e.parameter.email;
  var body = e.parmeter.message
  var subject = "My golf thing"
  try {
   MailApp.sendEmail(recipient, subject, body)
  }
  catch(e){
   Logger.log(e)
  }   
}

第一个脚本需要一个类似这样的获取请求。

  var response = UrlFetchApp.fetch("https://script.google.com/macros/s/SECOND_SCRIPT_ID/exec?email=b@b.com&message=somthing");
  return response;
于 2017-12-20T18:28:39.680 回答
0

我对这个问题很感兴趣,并为此做了更多的工作。我将其从获取请求更改为发布请求。

这是我在 Google 表格中的内容。

    function sendAlertEmails() {

      var ss = SpreadsheetApp.getActiveSpreadsheet();
      ss.setActiveSheet(ss.getSheetByName("Send Mails"));
      var sheet = SpreadsheetApp.getActiveSheet();
      var dataRange = sheet.getRange("A2:f2");
      var data = dataRange.getValues();
      for (i in data) {
        var rowData = data[i];
        var emailAddress = rowData[1];
        var recipient = rowData[0];
        var message1 = rowData[2];
        var message2 = rowData[3];
        var message3 = rowData[4];
        var message4 = rowData[5];
        var message = 'Hey ' + recipient + ',\n\n' + message1 + '\n\n' + ' The last player picked was ' + message2 + '\n\n' + message3 +'\n\n' + message4;
        var subject = '*GOLF DRAFT 2018* - YOU ARE ON THE CLOCK';    
        var data = {
         'name': 'Bob Smith',
         'email': 'a@b.com',
         'message': message,
         'subject': subject, 
        };
        var options = {
          'method' : 'post',
          'contentType': 'application/json',
          'payload' : data
        };

        var secondScriptID = 'STANDALONE_SCRIPT_ID'
        var response = UrlFetchApp.fetch("https://script.google.com/macros/s/" + secondScriptID + "/exec", options);
        Logger.log(response) // Expected to see sent data sent back
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        ss.setActiveSheet(ss.getSheetByName("DRAFT"));
    //    Browser.msgbox("Your Pick Has Been Made");
      } 
    }

以下是我在独立脚本中的内容。独立脚本工作有一些附加条件:

  • 它需要在“Deploy as a webapp”下发布
  • 访问权限应设置为“任何人,甚至匿名”
  • 每次对独立脚本进行更改时,再次发布并将项目版本更改为新版本。这就是从第一张工作表调用最新代码的调用。

独立脚本

function convertURItoObject(url){  
      url = url.replace(/\+/g,' ')
      url = decodeURIComponent(url)
      var parts = url.split("&");
      var paramsObj = {};
      parts.forEach(function(item){
         var keyAndValue = item.split("=");
         paramsObj[keyAndValue[0]] = keyAndValue[1]
      })  
     return paramsObj; // here's your object
    }


function doPost(e) { 

  var data = e.postData.contents;
  data = convertURItoObject(data)
  var recipient = data.email;
  var body = data.message;
  var subject = data.subject;
  try {
   MailApp.sendEmail(recipient, subject, body)
  }
  catch(e){
   Logger.log(e)
  } 
  return ContentService.createTextOutput(JSON.stringify(e));

}
于 2017-12-26T00:43:42.707 回答