Получить значения из 2 столбцов для каждого цикла Google App Script - PullRequest
0 голосов
/ 08 декабря 2018

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

Диапазон моего заказа выглядит следующим образом:

 Supplier Name  |   Item                | Qty
-----------------------------------------------------
My Veg Supplier |   Baby Spinach (Kg)   |0.8
My Veg Supplier |   Basil (Kg)          |0.1
My Veg Supplier |   Chives (KG)         |0.2
My Veg Supplier |   Lettuce Mixed       |1
My Veg Supplier |   Onions Spring       |3
Baking Supplier |   Apple Cruffin       |3
Baking Supplier |   Brioche Rolls       |7
Baking Supplier |   Croissant Plain     |17
Baking Supplier |   Dinner Roll         |6
Baking Supplier |   RSofa Ciabatta      |5
Baking Supplier |   Seed Loaf Large     |1

, а диапазон информации о моем поставщике выглядит следующим образом:

Supplier Name   |   Email           
-------------------------------------------------
My Veg Supplier |   veg@veg.com 
Baking Supplier |   bread@bread.com     

У меня есть сценарий, который проходит через желоб иправильно получает элементы на заказ, а также перебирает диапазон информации о поставщике и для каждого значения получает соответствующий адрес электронной почты.

Я опущу первую функцию, которая получает элементы на заказ, так как она довольно длиннаяи это не проблема, но я борюсь за то, чтобы сказать: «Проходить через поставщиков и получить имя поставщика и адрес электронной почты для mailApp.sendEmail и т. д.»

Моя текущая функция получает каждого поставщика и отправляет почту успешно, новсегда отправляет по всем адресам всех поставщиков, а не только адрес, связанный с этим поставщиком

Вот оно:

  function loopMail(){    
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var bulk = ss.getSheetByName("To Email");

        var SupplierVals = ss.getRange("H2:H").getValues(); //Supplier Column
        var Supplierlast = SupplierVals.filter(String).length;
        var supplierArray = bulk.getRange(2, 8,Supplierlast,1).getDisplayValues(); // unique supplier column

        var EmailVals = ss.getRange("J2:J").getValues(); //Email Column
        var EmailLast = EmailVals.filter(String).length;
        var emailArray = bulk.getRange(2, 10,Supplierlast,1).getDisplayValues(); // unique email column

      for each (var supplier in supplierArray ){
       for each (var emailAddress in emailArray ){
        var subject = "New Order";
        var emailBody = emailBody;
        MailApp.sendEmail(emailAddress,subject  + supplier,emailBody, {name: 'My Company', replyTo: 'orders@mycompany.com', to: emailAddress, htmlBody: emailBody});        
        var confirm = Browser.msgBox('Order has been sent to  ' + supplier + ' (' + emailAddress + ')', Browser.Buttons.OK); 
    }} 
}

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Как я намекал в своем комментарии, вы можете сделать это, используя два Array метода, forEach и filter.

Идея состоит в том,чтобы прочитать в соответствующем диапазоне значений листа для заказов и поставщиков:

const wb = SpreadsheetApp.getActive();
const orders = wb.getSheetByName("Orders").getDataRange().getValues();
const suppliers = wb.getSheetByName("Suppliers").getDataRange().getValues();

Затем выполните некоторые операции с каждым поставщиком и связанными с ним данными.Здесь используется метод reduce Array для создания одного открытого текста из заказов поставщика.

const supplierNameIndex = 0; // example - name in col A
const orderSupplierIndex = 3; // example - supplier name in col D
suppliers.forEach(function (supplier) {
  var name = supplier[supplierNameIndex];
  var supplierOrders = orders.filter(function (order) { return order[orderSupplierIndex] === name; });
  // Log data to Stackdriver for debug purposes
  console.log({message: "All orders for " + name, orderData: supplierOrders});

  // Do something with the filtered orders
  var preface = name + "\n\nPlease order the following:\n\n\tName\tSKU\tQuantity\n";
  var bodyText = supplierOrders.reduce(function (text, order) {
    text += "\t" + order[0] + "\t" + order[1] + "\t" + order[2] + "\n";
    return text;
  }, preface);
  bodyText += "\nThanks,\nShift Supervisor Steve";
  console.log({message: "Email text", text: bodyText});
});
0 голосов
/ 11 декабря 2018

Не меняя мой код слишком много, у меня сработало следующее, помещенное в каждый цикл

  //get email address of supplier - ie the value to the right of supplier column
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var dataRange = sheet.getRange(2,8,10,2); // Column H:J
  var values = dataRange.getValues();

  for (var i = 0; i < values.length; i++) {
    for (var j = 0; j < values[i].length; j++) {     
      if (values[i][j] == supplier) {
        var emailAddress = values[i][j+1];
        Logger.log("Email Address: " +emailAddress);
      }
    }    
  }  //END get email address of supplier - ie the value to the right of supplier column
0 голосов
/ 09 декабря 2018

Попробуйте это:

Функция поддержки.Я использовал немодальное диалоговое окно для отладки кода.

function colHeight(col){
  var col=col || 1;
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getRange(1,col,sh.getLastRow(),1);
  var vA=rg.getValues();
  for(var i=vA.length-1;i>-1;i--){
    if(!vA[i][0]){
      vA.splice(i,1);
    }else{
      break;
    }
  }
  return vA.length;
}

Вот основная функция:

function emailVendorOrders(){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Orders');
  var erg=sh.getRange(2,5,colHeight(5)-1,2);
  var eA=erg.getValues();
  var emailObj={};
  for(var i=0;i<eA.length;i++){
    emailObj[eA[i][0]]=eA[i][1];
  }
  var orderObj={};
  var org=sh.getRange(2,1,colHeight(1)-1,3);
  var oA=org.getValues();
  for(var i=0;i<oA.length;i++){
    if(orderObj.hasOwnProperty(oA[i][0])){
      orderObj[oA[i][0]].push({Item:oA[i][1],Qty:oA[i][2]});
    }else{
      orderObj[oA[i][0]]=[];
      orderObj[oA[i][0]].push({Item:oA[i][1],Qty:oA[i][2]});
    }
  }
  var hl='';
  for(key in orderObj){
    s='';
    s1='';
    s+=Utilities.formatString('Supplier: %s<br />',key);
    s1+=Utilities.formatString('Supplier: %s\n',key)
    s+=Utilities.formatString('Email Address: %s<br />',emailObj[key]);
    s1+=Utilities.formatString('Email Address: %s\n',emailObj[key]);
    for(var i=0;i<orderObj[key].length;i++){
      s+=Utilities.formatString('Item: %s Qty: %s<br />',orderObj[key][i].Item,orderObj[key][i].Qty);
      s1+=Utilities.formatString('Item: %s Qty: %s\n',orderObj[key][i].Item,orderObj[key][i].Qty);
    }
    s+='<br />';
    s1+='\n';
    var subject='New Order';
    //MailApp.sendEmail(emailObj[key[,subject  + key,s1, {name: 'My Company', replyTo: 'orders@mycompany.com', to: emailObj[key], htmlBody: s});
    hl+=s;
  }
  var ui=HtmlService.createHtmlOutput(hl);
  SpreadsheetApp.getUi().showModelessDialog(ui, 'title');
}

Вот как выглядит моя электронная таблица.Мои диапазоны немного отличаются от ваших.

enter image description here

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