GmailApp.SendEmail не работает с учетной записью G Suite

#google-apps-script #google-drive-api #google-workspace #urlfetch

#google-apps-script #google-drive-api #google-workspace #urlfetch

Вопрос:

Я пытаюсь использовать GmailApp.SendEmail для отправки PDF-файла Google Sheet по электронной почте. Скрипт работает, когда у отправителя есть @gmail.com учетная запись, но по какой-то причине учетная запись GSuite (не @gmail.com ) отправляет HTML-документ, который не содержит PDF-файл листа.

Вот фрагмент моего кода, пока я использую только GmailApp .. в этой части.

 function printForward() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheets()[3];
  // if you change the number, change it also in the parameters below
  var shName = sh.getName()
  var ssname = ss.getName();
  var length = ssname.length;
  var date = ssname.substring(0,length-15);
  const body = "All, <br><br>Attached is the invoice for the week of "  date "." "<br><br> Thank you, <br> Elizabeth Moscoso";
  var fnumber = 2;
  sendSpreadsheetToPdf(3, shName, ss.getRange('Constants!T5').getValue(),"Invoices " date, body, date, fnumber);
}

function printMidwest(){
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sh = ss.getSheets()[5];
 var shName = sh.getName();
 var ssname = ss.getName();
 var length = ssname.length;
 var date = ssname.substring(0, length-15);
 const body = "All, <br><br>Attached is the invoice for the week of "  date "." "<br><br> Thank you, <br> Elizabeth Moscoso";
 var mnumber = 1;
 sendSpreadsheetToPdf(5, shName, ss.getRange('Constants!T5').getValue(), "Invoices " date, body, date, mnumber);
}


function sendSpreadsheetToPdf(sheetNumber, pdfName, email,subject, htmlbody, invcdate, foldNum) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = spreadsheet.getId()  
  var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;
  var url_base = spreadsheet.getUrl().replace(/edit$/,'');

  if(foldNum == 2){var url_ext = 'export?exportFormat=pdfamp;format=pdf'   //export as pdf

        (sheetId ? ('amp;gid='   sheetId) : ('amp;id='   spreadsheetId)) 
      // following parameters are optional...
        'amp;size=A4'      // paper size
        'amp;portrait=true'    // orientation, false for landscape
        'amp;fitw = true' // fit to width, false for actual size
        'amp;sheetnames=falseamp;printtitle=falseamp;pagenumbers=false'  //hide optional headers and footers
        'amp;gridlines=false'  // hide gridlines
        'amp;fzr=false';       // do not repeat row headers (frozen rows) on each page
      }
  if(foldNum == 1)
  {var url_ext = 'export?exportFormat=pdfamp;format=pdf'   //export as pdf
      
        (sheetId ? ('amp;gid='   sheetId) : ('amp;id='   spreadsheetId))
      // following parameters are optional...
        'amp;size=A4'      // paper size
        'amp;portrait=true'    // orientation, false for landscape
        'amp;fitw = true' // fit to width, false for actual size
        'amp;sheetnames=falseamp;printtitle=falseamp;pagenumbers=false'  //hide optional headers and footers
        'amp;gridlines=false'  // hide gridlines
        'amp;fzr=false';       // do not repeat row headers (frozen rows) on each page
      }


  var options = {
    headers: {method:"GET",
      'Authorization': 'Bearer '   ScriptApp.getOAuthToken(),
    }
  }

  var response = UrlFetchApp.fetch(url_base   url_ext, options);
  var blob = response.getBlob().setName(pdfName " Invoice "  invcdate  '.pdf');
 
  var mailOptions = {};
  var attachmentArray = [];
  
  if(blob){
  attachmentArray.push(blob);
  mailOptions.attachments = attachmentArray;
  }
 
  if(htmlbody){
  mailOptions.htmlBody = htmlbody;
  }
  
  if(email){
  GmailApp.sendEmail(email,subject,"",mailOptions);
  }
 
  //save PDF
  const nameFile = "Forward "   invcdate   ".pdf";
  if(foldNum == 2){
  var forwardFolder = DriveApp.getFolderById("1-n7O87J0zN7ZnOtErhcJR_JDbkrjSyj8");
  forwardFolder.createFile(blob);}
  if(foldNum == 1){
  var midwestFolder = DriveApp.getFolderById("17cQrFnAzy3B6jmwZB5-Osa6G7oC3YOLw")
  midwestFolder.createFile(blob);
  }

}


  

Я не уверен, почему учетная запись GSuite не сможет отправить электронное письмо / pdf. Кроме того, если я полностью удалю часть отправки электронной почты и сохраню в учетной записи GSuite только PDF-файл, он выдает тот же HTML-файл.

Комментарии:

1. Расшифровка выполнения; вы видите какие-либо ошибки? Можете ли вы поместить несколько Logger.log() строк, чтобы проверить, есть ли email данные?

2. Попробуйте использовать что-то другое, кроме пустой строки для body параметра GmailApp.sendEmail() . Не уверен, почему это имеет значение, просто идея.

3. убедитесь, что вы действительно вводите эту инструкцию if: if(email){ GmailApp.sendEmail(email,subject,"",mailOptions); }

4. Я бы не был слишком уверен, что заголовок правильный, при чтении последнего абзаца.

5. Привет! Что вы получаете, если получателем является учетная запись G Suite? Просто пустой HTML? Вы получаете какие-либо ошибки в коде скрипта приложений?

Ответ №1:

Я только что попробовал сам, URL, подобный этому, должен экспортировать PDF (при условии правильной области OAuth2). Для экспорта в PDF потребуется область https://www.googleapis.com/auth/spreadsheets.readonly действия .

 var url = 'https://docs.google.com/document/d/'   id   '/export?format=pdf'
  

Очевидно, что это приведет к экспорту всего документа, но позже его можно сузить.


Вы также можете попробовать использовать class MailApp вместо class GMailApp , что не будет часто вызывать запросы на повторную авторизацию при внесении изменений в скрипт (это может быть фактором). Если вам не нужен доступ к почтовому ящику GMail пользователя, нет никаких оснований для использования GMailApp .

Области авторизации OAuth2 также различаются; класс GMailApp использует довольно широкую область:

 https://mail.google.com/
  

В то время как класс MailApp использует довольно специфическую область:

 https://www.googleapis.com/auth/script.send_mail
  

И из вопроса также не совсем понятно, импортирована ли у вас библиотека «OAuth2 for Apps Script»; его идентификатор будет: 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF .

Комментарии:

1. Я попробую использовать GmailApp

2. Да? Вы уже используете его. Проблема может заключаться в том, что даже не удается прикрепить PDF-файл. И я также задавался вопросом о параметре exportFormat=pdf , который кажется избыточным… при наличии надлежащих областей это обычно должно работать (в целом ваш скрипт может быть немного устаревшим). Я бы предложил начать сначала с наименьших параметров, необходимых для экспорта любого PDF-файла, а затем добавить дополнительные параметры.

3. Я обнаружил, что url_base возвращает что-то другое при использовании учетной записи G Suite. Обновление этого позволяет корректно печатать PDF. Спасибо за помощь.

4. Нет проблем; пожалуйста, рассмотрите возможность принятия моего ответа… даже если бы я не мог назвать точную причину; предоставление URL-адреса, который, как известно, работает, могло быть главной подсказкой.