如何让简单的 google 应用程序脚本从所有者帐户的表格发送邮件,而不管谁在访问文件

How to have simple google apps script send mails from Sheets from owner account regardless of who's accessing file

过去几天我一直在四处寻找答案,但似乎找不到对我有意义的答案(原谅我,我对 GAS 还很陌生)。我正在尝试设置一个 Fantasy Golf Draft sheet 供大约 12 个用户使用,但其中超过一半 have/aren 不愿意使用 Gmail 地址。访问该文件没有问题,我 运行 遇到一个问题是尝试 运行 一个脚本,当单击 Button/Shape 时,它会自动发送一封电子邮件到下一个轮到它的人来挑选。脚本的功能正常工作,当它来自我自己或拥有 Google 帐户且可以授权脚本等的人时。我 运行 遇到没有 Google 帐户的人的麻烦。

我的问题 - 如何将脚本设置为仅从我的电子邮件或 Sheet/Script 所有者的电子邮件发送 - 无论 modifying/clicking 按钮是谁?我看到 link 有关将脚本创建为 Web 应用程序来执行此操作的信息,但我很快就迷路了。

这是我的 sheet 的 link: [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"));
  }
   
}

如有任何帮助,我们将不胜感激!

不,你不能这样做,因为脚本可以与多个用户共享,并且始终从他们自己的帐户而不是脚本所有者帐户执行,并且脚本使用 'from email address'执行用户,Google 不允许从另一个用户帐户发送电子邮件作为安全策略。

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

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;

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

这是我在 Google sheet 中的内容。

    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"
  • 访问权限应设置为'Anyone, even anonymous'
  • 每次您对独立脚本进行更改时再次发布并 将项目版本更改为新版本。这就是从第一个 sheet 调用到最新代码的调用。

独立脚本

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));

}