Есть ли способ получить желаемый диапазон таблицы для отправки электронной почты на основе значения столбца? - PullRequest
0 голосов
/ 24 апреля 2019

Часть моей ежедневной работы - отправлять поставщикам ряд ячеек таблицы Google, чтобы запросить образцы материалов для изготовления рюкзака.

Я написал несколько действительно полезных сценариев. Но с этим у меня действительно нет никакого понятия, чтобы "показать некоторый испытанный код". Пожалуйста, смотрите мое описание ниже.

  1. Мне бы хотелось иметь скрипт, который запускается через столбцы VENDOR и STATUS, чтобы решить, какой VENDOR отправлять электронную почту в MAIL (i, 6) по информации из [ИМЯ ЭЛЕМЕНТА (i, 1): UNIT (i) , 5)]

  2. Я бы хотел отправить электронное письмо только в строки, в которых значение STATUS = false (не проверено), и после отправки электронного письма я позволю сценарию изменить значение ячейки с false → true (поэтому в следующий раз, если я запустите скрипт снова, он не будет дублировать информацию для получателя)

  3. И сложность для меня в том, что я не знаю, как собирать информацию по имени VENDOR. Так что с таблицей Google лист выше, я хотел бы отправить 3 письма по заказу:

    а. supplierC@gmail.com (ОДНА ЗВЕЗДА) → отправить строку 21 + строка24 + строка 26 (только столбец от А до E +, затем проверить ячейку)

    б. supplierB@gmail.com (YKK) → отправить строку 22 + строка25 (только столбец от A до E +, затем проверить ячейку)

    с. supplierA@gmail.com (DUCKSAN) → отправлять только строку 27 (только столбец от A до E +, затем проверить ячейку) (поскольку проверена строка 23 - значит, я уже отправил или не хочу отправлять сейчас)

ФОТО

Я разместил фотографии в Google Photo, чтобы показать вам, ребята:

Таблица

table

а

a

б

b

c :

c


ОБНОВЛЕНИЕ ВОПРОСА С моей первой информацией по этому вопросу приведенные ниже коды Tedinoz прекрасно работают для меня.

Но что, если на листе "HTS" столбец электронной почты будет заменен столбцом кода материала, а затем я включу всю информацию о поставщиках в лист "dev", который я использую для ежедневного мониторинга всех брендов или создания лист только для мониторинга поставщиков (пожалуйста, сообщите об этом). Пожалуйста, проверьте электронную таблицу stackoverflow снова, я включил лист "dev" для справки (прокрутите вниз до строки 42, где начинается строка с информацией о поставщиках)


1 Ответ

0 голосов
/ 25 апреля 2019

Сценарий ОП был, в некоторой степени, уникальным, поскольку требовал пакетной отправки электронной почты поставщикам и компиляции электронной почты в формате HTML для элементов, относящихся к каждому поставщику (на основе значения флажка.

Этот код:

  • Извлекает данные из листа группы продуктов (имя листа является переменной, поэтому код можно дополнительно автоматизировать),
  • Создает временный список поставщиков,
  • Цикл по поставщикам, по одному за раз
    • Цикл по данным и захватывает любой элемент, у которого имя поставщика совпадает И флажок снят (ложно).
    • данные элемента поставщика постепенно записываются в массив, а после завершения массив записывается на временный лист (хотя, возможно, это может быть дополнительно настроено)
    • Создается html-сообщениеиз данных временного листа.
    • Сообщение отправляется поставщику с помощью Gmail.sendEmail.
    • Удаляет информацию о временном извлечении из листа временного вывода
  • Сбрасывает снятые флажки обратно на «флажок»

function so5582181508() {

  //setup spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var datasheetname = "HTS";
  var datasheet = ss.getSheetByName(datasheetname);
  var messagesheetname = "MessageOutput";
  var messagesheet = ss.getSheetByName(messagesheetname);
  var templatesheetname = "Email Template";
  var templatesheet = ss.getSheetByName(templatesheetname);  
  messagesheet.clear();

  // get the number of rows on the data sheet
  var Avals = datasheet.getRange("A1:A").getValues();
  var Alast = Avals.filter(String).length;
  //Logger.log("Alast = "+Alast);
  var htslast = datasheet.getLastRow();
  //Logger.log("htslast = "+htslast);



  // get the supplier column
  var supplierRange = datasheet.getRange(3,7,Alast-2,1);
  //Logger.log("the supplier range  = "+supplierRange.getA1Notation());
  //get the supplier data
  var supplierData = supplierRange.getValues();

  //get the status column
  var statusRange = datasheet.getRange(3,9,Alast-2,1);
  //Logger.log("the status range  = "+statusRange.getA1Notation());
  // get the status data
  var statusData = statusRange.getValues();

  var transCount = supplierData.length;
  var supplierList = [];
  var transData = datasheet.getDataRange().getValues();

  // supplierList contains the unique supplier list
  supplierData.forEach(function(x){
    if(supplierList.indexOf(x[0]) === -1 && x[0]!="" ){
        supplierList.push(x[0]);
    }                   
  });
  var supplierCount = supplierList.length;


  var itemCount = 0;
  var mailMessage = [];
  var mailItem = [];

  //build the mail item header
  var mailItemHeader = [];
  mailItemHeader.push(transData[0][0]);
  mailItemHeader.push(transData[0][1]);
  mailItemHeader.push(transData[0][2]);
  mailItemHeader.push(transData[0][3]);
  mailItemHeader.push(transData[0][4]);
  //mailItemHeader.push(transData[0][6]);

  //Logger.log("length of new array = "+supplierCount);
  //Logger.log("Number of items in table = "+transCount);


  // loop through the data, once for every supplier
  for (supplier = 0; supplier<supplierCount; supplier++){
    mailMessage=[];
    itemCount = 0;
    //Logger.log("supplier = "+supplier);
    //Logger.log("supplier = "+supplierList[supplier]);

    // now loop through the data
    // start i = 2 to allow for header
    for (var i = 2; i < transCount+2; i++) {
      mailItem=[];
      //Logger.log("i = "+i+", SupplierList: "+supplierList[supplier]+", supplier: "+transData[i][6]+", status:"+transData[i][8])

      // the suplier matches and if the checkbox is false
      if (supplierList[supplier] == transData[i][6] && transData[i][8] == false){

        // this this is the first item then push the mail header 
        if (itemCount ==0){
          mailMessage.push(mailItemHeader);
          // get the email address
          var emailAddress = transData[i][5];
          var subject = "Purchase order";

        }

        // this is a match
        var emailAddress = transData[i][5];
        //Logger.log("send email to "+supplierList[supplier]+", at "+transData[i][5]);
        //Logger.log("Item: "+transData[i][0]+", Spec: "+transData[i][1]+", color: "+transData[i][3]+", quantity: "+transData[i][4]+", Unit: "+transData[i][5]);

        // push the transation values for this row onto the mailitem array
        mailItem.push(transData[i][0]);
        mailItem.push(transData[i][1]);
        mailItem.push(transData[i][2]);
        mailItem.push(transData[i][3]);
        mailItem.push(transData[i][4]);
        //mailItem.push(transData[i][6]);

        // push the row onto the rest of the mail message data
        mailMessage.push(mailItem);
        itemCount=itemCount+1

        //update the status value to true
        statusData[i-2] = [true];
      }
      else
      {
      //Logger.log("no match");
      }

    } // end of the transaction loop for this supplier

    // define the temporary output range
    var messageRange = messagesheet.getRange(1, 1, mailMessage.length, 5);
    // paste the items details to the temporary output range
    var messageupdate = messageRange.setValues(mailMessage);
    // get the values for the items only (no header)
    var messagedata = messagesheet.getRange(2, 1, mailMessage.length-1, 5).getValues();
    //Logger.log("ROW#1 col1="+messagedata[0][0]+", column 2: "+messagedata[0][1]);
    //Logger.log("ROW#1 col1="+messagedata[1][0]+", column 2: "+messagedata[1][1]);
    //Logger.log("message data length"+messagedata.length);  
    var messageitemcount = messagedata.length;
    //Logger.log("send email to "+supplierList[supplier]+", at "+emailAddress+", message: "+mailMessage);

    // create a subject
    var emailSubject = "Purchase Order: StackOverflow Test";
    // get the email address
    var emailaddress = emailAddress;

    // message
    var messagePrefix = "Attention: "+supplierList[supplier];

    // start the build of the html message
    var columns = 5;
    var columncount=1;
    var message = 'Please supply the following products:<br><br><table style="border-collapse:collapse;" border = 1 cellpadding = 5>';
    // get the headers
    for (h=0; h<columns;h++){

      if (columncount ==1){
        var header = '<tr>';
      }

      header+='<th style="background-color:#ffeb3b">'+mailItemHeader[h]+'</th>';

      if (columncount ==5){
        header+='</tr>';
      }
      columncount=columncount+1
    }
    //Logger.log("header:"+header);

    // add the header to the mesage
    message+=header;

    // loop through the items on the temporary output and get the item values
    for(c=0;c<messageitemcount;c++){

      // increment message
      message+='<tr><td>'+messagedata[c][0]+'</td>'+'<td>'+messagedata[c][1]+'</td>'+'<td>'+messagedata[c][2]+'</td>'+'<td>'+messagedata[c][3]+'</td>'+'<td>'+messagedata[c][4]+'</td></tr>';

    }

    // finalise the message
    message+='</table>';  
    // Logger.log("DEBUG: message: "+message);//DEBUG

    // send the email
    GmailApp.sendEmail(emailaddress, emailSubject,  messagePrefix, {htmlBody: message,  });

    // clear the state from the temporary outsheet sheet
    messagesheet.clear();

  }
  //update the status range - return all to ticked (true)
  statusRange.setValues(statusData);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...