Скрипт Google Apps, который проходит через фильтр и отправляет электронное письмо с PDF-файлом? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть данные из анкеты (20K строк), которыми мне нужно поделиться с менеджерами магазинов (отчет) наших магазинов (400 магазинов). Мне удалось написать сценарий, который отправляет pdf моего листа на список адресов электронной почты. Но я застрял на написании l oop для фильтра, так как я не могу заставить функцию setVisibleValues(values) работать для FilterCriteriaBuilder. Функция setHiddenValues(values) работает, но я не могу понять, как совместить ее с l oop.

Образец моего листа Google

См. Ниже для моего текущего кода:

/**
 * Filtersheet by location
 */
function FilterSheet() {
  var spreadsheet = SpreadsheetApp.getActive().getSheetByName('Data')
  spreadsheet.getRange('F1').activate();
  var criteria = SpreadsheetApp.newFilterCriteria()
  .setHiddenValues(['Amsterdam, Rotterdam'])
  .build();
  spreadsheet.getFilter().setColumnFilterCriteria(6, criteria);
};

/**

 * Send pdf of currentspreadsheet
 */
function SendPdf() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var spreadsheet = SpreadsheetApp.getActive().getSheetByName('Adres');
  var blob = DriveApp.getFileById(ss.getId()).getAs("application/pdf");
  blob.setName(ss.getName() + ".pdf");

  var startRow = 2; // First row of data to process
  var numRows = 2; // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = spreadsheet.getRange(startRow, 1, numRows, 2);
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i in data) {
    var row = data[i];
    var emailAddress = row[0]; // First column
    var message = 'I hearby send you the overview of your data'
    var subject = 'Overview of data';
    MailApp.sendEmail(emailAddress, subject, message,{
      attachments:[blob]});
  }
 }

Ответы [ 2 ]

1 голос
/ 05 мая 2020

getValues() возвращает значения всех ячеек диапазона независимо от того, показаны они или скрыты.

Используйте al oop и isRowHiddenByFilter (rowPosition) , чтобы получить все отфильтрованные ценности. Вы можете использовать Array.prototype.push, чтобы добавить значения в новый массив, или Array.prototype.splice, чтобы изменить массив, содержащий значения, возвращаемые getValues()

Связанные

0 голосов
/ 08 мая 2020

Мне удалось решить проблему.

Этот скрипт использует электронную таблицу Google с двумя листами, один с данными и один с комбинацией адресов электронной почты. Он отправляет отфильтрованный список (столбец фильтра F) данных листа в соответствующий салон (местоположение) в адресах электронной почты листа (электронная почта в режиме var). Кроме того, у него есть возможность «хранить» PDF-файлы на вашем диске Google (хранилище режима var)

*/

function construct() {
  // settings:
  //var mode = "store";
  var mode = "email";

  // get list of all salons and email
  var salonList = SpreadsheetApp.getActive().getSheetByName('EmailAdressen');
  // set endvar for loop
  var endRow = salonList.getLastRow();

  // loop trough the rows to get the Salon name and the corresponding email
  for(i=1;i<=endRow;i++){
    var salonName = salonList.getRange(i,2).getValue();
    var email = salonList.getRange(i,1).getValue();    

    // create an array with all salons that should be hidden (we cant pick which one to show, so we have to go the other way around...)
    var filterArray = [];
    // create array with all salons to hide
    for(c=1;c<=endRow;c++){
      // get value from email list, check if it is not the current selected one and if so add it to the list to filter out
      salonFilterName = salonList.getRange(c,2).getValue();
      if(salonFilterName != salonName) {
        filterArray.push(salonFilterName);
      }
    } // end for c

    // filter the list with the array we just created
    var spreadsheet = filterList(filterArray);

    if(mode == "email"){
      // export to PDF
      var pdf = exportToPdf(spreadsheet);
      // email to email address belonging to this salon
      emailToAddress(email, pdf);

    } // end if
    if(mode == "store"){
      StorePdf(spreadsheet, salonName);
    }

  } // end for i
  return;
}

function filterList(salonNameArray) {

  // select data sheet
  var spreadsheet = SpreadsheetApp.getActive().getSheetByName('Data');

  // first remove all existing filters to make sure we are on a clean sheet
  if(spreadsheet.getFilter()){
    spreadsheet.getFilter().remove(); 
  }

  // create the filter
  spreadsheet.getRange('F:F').createFilter();

  // set criteria for filter with array passed from construct
  var criteria = SpreadsheetApp.newFilterCriteria().setHiddenValues(salonNameArray).build();

  // apply filter
  spreadsheet.getFilter().setColumnFilterCriteria(6, criteria);
  return spreadsheet;
}

function exportToPdf(ss) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheet = SpreadsheetApp.getActive().getSheetByName('Data');
  var blob = DriveApp.getFileById(ss.getId()).getAs("application/pdf");
  blob.setName(ss.getName() + ".pdf");

  return blob;
 }

function StorePdf(ss, salonName) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheet = SpreadsheetApp.getActive().getSheetByName('Data');
  var blob = DriveApp.getFileById(ss.getId()).getBlob();
  blob.setName(salonName + "_" + Utilities.formatDate(new Date(), "GMT+1", "ddMMyyyy")+".pdf");

  DriveApp.createFile(blob);
  return;
 }

function emailToAddress(email, pdf) {
  MailApp.sendEmail(email, 'Type here the subject', 'Type here the body',{
      attachments:[pdf]});
  return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...