Как записать результат цикла в Google Sheet - PullRequest
0 голосов
/ 11 февраля 2019

Ниже код отправляет электронные письма, включая таблицу в теле со строками данных и заголовком в формате html.Он также присоединяет те же данные в файл xlsx и pdf.Кому-то нравится в pdf, кому-то нравится в теле письма, кому-то нравится в xlsx, так что ...

У меня есть 2 проблемы с кодом ниже:

Результат цикла, таблица / строки, должны быть записаны на листе Google (экспорт).Затем этот лист будет прикреплен в формате PDF и XLSX к отправленному письму.

В настоящее время лист «Экспорт» уже прикреплен, но он «пустой», так как данные еще не записаны в лист экспорта, вот вопрос, как?

Я уже пытался добавитьстроки "xlsxTable + = data [row] [col];"в коде, чтобы перехватить данные, но я не думаю, что это правильный способ сделать это.

Вторая проблема заключается в том, что иногда вложение (xlsx) не «правильно» отформатировано и содержит следующие слова: «Этот файл может быть un ".(Предварительный просмотр Google) При загрузке xlsx говорится, что формат файла неправильный ... но странно то, что при отправке 3 разных писем 2 из них в порядке, 1 - нет, иногда все в порядке.Возможно, это проблема синхронизации и должна включать паузу.

Любая помощь приветствуется, спасибо!

Ниже в коде используются листы Google, с 4 листами внутри: данные, электронные письма, параметры, экспорт.

Таблица данных

ID    Name      Amount   Date
1000  Company    500.23  01/01/2019
2000  Company    500.23  01/01/2019
1000  Company    500.23  01/01/2019
3000  Company    500.23  01/01/2019
1000  Company    500.23  01/01/2019
2000  Company    500.23  01/01/2019

Таблица сообщений электронной почты

ID      To  Cc Bcc FirstName Subject Language BodyStart BodyEnd Sent SentDate
1000    Company1@email.com
2000    Company2@email.com
3000    Company3@email.com

Таблица параметров содержит только ReplyTo & ReplyToName

Фактический код

function Statements_Attachments() {

  //This section specifies the sheet and some fixed variables.

    var ss = SpreadsheetApp.getActiveSpreadsheet();  
    var dataRange = ss.getSheetByName("Data").getDataRange();
    var emailRange = ss.getSheetByName("Emails").getDataRange();
    var param = ss.getSheetByName("Parameters");
    var data = dataRange.getValues();
    var nameData = emailRange.getValues();
    var lastCol = dataRange.getLastColumn();
    var lastRow = emailRange.getLastRow();
    var replyEmail = param.getRange("B2").getValue();
    var replyName = param.getRange("B3").getValue();
    var sentRange = ss.getSheetByName("Emails");
    var startRow = 1;
    var sent = "Y";

    var ssA = SpreadsheetApp.getActive();
    var ssID = ssA.getId();
    var ssName = ssA.getName();
    var sheetName = "Export";  //Fill in Sheet Name you want to Email
    var shID = getSheetID(sheetName); //Get Sheet ID of Sheet Name

  //This section below starts the loop comparing the key between the 2 sheets.

  for (var i = 1; i < nameData.length; i++) {

    var rows = nameData[i];
    var emailAddress = rows[2]; 
    var keyID = rows[0];
    var ccMail = rows[3];
    var bccMail = rows[4];
    var bodyStart = rows[8]; 
    var bodyEnd = rows[9];
    var keyName = rows[1];
    var subject = rows[6] ;
    var emailSent = rows[10];
    var xlsxTable = "";         //Variable used to collect the Data for pasting in "Export Sheet"
    var exportTable = "";       //Variable used to paste Data in "Export Sheet"
    var htmlTable = "";         // HTML body Table created to paste in Email
    var htmlMessage = "";
    var preTable = '<!DOCTYPE html><html>' + bodyStart ;
    var postTable = '</html>';   

    for (row = 0; row < data.length; row++) {
      if (row == 0){
        for (col = 0; col < data[row].length; col++) {
          if (col == 0) {
              htmlTable += '<tr><th style="border-collapse: collapse;border: 1px solid black;background-color:#558EDB">' + data[row][col] + '</th>';
              xlsxTable += data[row][col];
          } else
          if (col == lastCol - 1) {
              htmlTable += '<th style="border-collapse: collapse;border: 1px solid black;background-color:#558EDB">' + data[row][col] + '</th></tr>';
              xlsxTable += data[row][col];
          } else {
              htmlTable += '<th style="border-collapse: collapse;border: 1px solid black;background-color:#558EDB">' + data[row][col] + '</th>';
              xlsxTable += data[row][col];
          }
        }      
      }
      else if (data[row][0] == keyID) {
        for (col = 0; col < data[row].length; col++) {
          if (col == 0) {
              htmlTable += '<tr><td style="border-collapse: collapse;border: 1px solid black">' + data[row][col] + '</td>';
              xlsxTable += data[row][col];
          } else
          if (col == lastCol - 1) {
              htmlTable += '<td style="border-collapse: collapse;border: 1px solid black">' + data[row][col] + '</td></tr>';
              xlsxTable += data[row][col];
          } else
          if (col == 6) {
              htmlTable += '<td align="right" style="border-collapse: collapse;border: 1px solid black">' + data[row][col] + '</td>';
              xlsxTable += data[row][col];
          } else
          if (col == 20 || col == 21) {
              htmlTable += '<td style="border-collapse: collapse;border: 1px solid black">' + Utilities.formatDate(data[row][col], "GMT", "dd-mm-yyyy") + '</td>';
              xlsxTable += data[row][col];
          } else {
              htmlTable += '<td align="right" style="border-collapse: collapse;border: 1px solid black">' + data[row][col] + '</td>';
              xlsxTable += data[row][col];
          }
        }  
      }
    }


    //The section below closes the table in the body and constructs the complete body.

      htmlTable += '</tbody></table>';
      htmlMessage = preTable + htmlTable + bodyEnd + postTable;


    //The section below should paste the Data into the Export Sheet, to be used as basis for the xlsx & pdf attachment to the email.

      exportTable = xlsxTable;
    //How to write the result to the Export Sheet in columns and rows.

    //The section below sets the variables for the Attachment.

      var url = "https://docs.google.com/spreadsheets/d/"+ ssID + "/export?format=xlsx&id="+ ssID +"&gid="+ shID;
      var urlPdf = url + "&portrait=true" + "&exportFormat=pdf";

      var paramsP = {
        method      : "get",
        headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
        muteHttpExceptions: true
      };

      var paramsX = {
        method      : "get",
        headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
        muteHttpExceptions: true
      };


      var blobPdf = UrlFetchApp.fetch(urlPdf, paramsP).getBlob();
      var blobP = blobPdf.setName(sheetName + ".pdf");

      var blobXlsx = UrlFetchApp.fetch(url, paramsX).getBlob();
      var blobX = blobXlsx.setName(sheetName + ".xlsx");


    //The section below retrieves alias email address to send as

      var me = Session.getActiveUser().getEmail();// Log the aliases for this Gmail account.
      var aliases = GmailApp.getAliases(); // Gets the alias from account
      Logger.log(aliases);  // Logs the alias


    // The section below sends the actual emails

       if (emailAddress != "" && emailSent != sent){   //If next email address needs to be different add: && nextEmail != emailAddress
         if (aliases.length > 0){  // Prevents sending duplicates

         GmailApp.sendEmail(emailAddress, subject, '', {
           htmlBody: htmlMessage,
           from : aliases[1],
           cc : ccMail,
           bcc : bccMail,
           replyTo : replyEmail,
           name : replyName,
           attachments : [blobP, blobX],
         });

    // The section below puts a "Y" next to the row already processed.

          sentRange.getRange(startRow + i, 11).setValue(sent);
          sentRange.getRange(startRow + i, 12).setValue(new Date ());    

          //Utilities.sleep(1000);
          SpreadsheetApp.flush();  // Make sure the cell is updated right away in case the script is interrupted

          }   
        }  
     }
  }


function getSheetID(name){
 var sheetName = SpreadsheetApp.getActive().getSheetByName(name)
 var sheetID = sheetName.getSheetId().toString() 
 return sheetID
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...