Funzione ReportMail - Carichi

di il
1 risposte

Funzione ReportMail - Carichi

Buongiorno,

Da una settimana e qualcosa mi trovo di fronte a questo rompicapo con Google Sheet e AppScript.
La mia intenzione è quella di facilitare il lavoro ai miei colleghi quando fanno i carichi del Bar (lavoro in un ristorante).

Questi al momento lavorano su un foglio Excel privo di funzionalità, in cui si trovano ad effettuare diversi passaggi:
- Aggiornare l'inventario (Trascrizione del testo manuale con l'errore del conteggio) 
- Stendere la lista dei carichi (Al momento carta e penna)
- Inviare un Email di Report + Firma del responsabile in turno. 

Il tutto è presente su un unico foglio denominato “Inventario” ove è presente la tabella con i vari elementi e le quantità presente.

Per semplificare in un primo momento la cosa, ho scritto il seguente codice, incorporato al precedente foglio + un foglio denominato “Carichi”

function onEdit(e) {
  var range = e.range;
  var sheet = range.getSheet();
  var sheetName = sheet.getName();

  // Verifica se la modifica è stata effettuata nel foglio "Carichi"
  if (sheetName === "Carichi") {
    var row = range.getRow();
    var column = range.getColumn();
    
    // Verifica se la modifica è stata effettuata nella casella di controllo C13
    if (range.getA1Notation() === "C13" && e.value === "TRUE") {
      // Azzerare la casella di controllo dopo la conferma
      range.setValue("FALSE");
      
      // Esegui la sottrazione delle quantità nel foglio "Inventario"
      var carichiRange = sheet.getRange("B2:C12");
      var carichiData = carichiRange.getValues();
      var inventorySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Inventario");
      var inventoryRange = inventorySheet.getRange("B2:C");
      var inventoryData = inventoryRange.getValues();
      
      for (var i = 0; i < carichiData.length; i++) {
        var productName = carichiData[i][0];
        var quantity = carichiData[i][1];
        
        if (productName !== "") {
          for (var j = 0; j < inventoryData.length; j++) {
            if (inventoryData[j][0] === productName) {
              inventoryData[j][1] = inventoryData[j][1] - quantity;
              break;
            }
          }
        }
      }
      
      inventoryRange.setValues(inventoryData);
      
      // Azzerare solo le quantità nel foglio "Carichi" dopo la conferma
      for (var i = 0; i < carichiData.length; i++) {
        carichiData[i][1] = "";
      }
      carichiRange.setValues(carichiData);
    }
  }
}

Questo codice permette dunque, in collaborazione con gli altri, di accedere a questo “Blocco appunti” e scrivere cosa si è preso man mano durante l'arco della giornata. Chi andrà a chiudere il Bar, avrà semplicemente il compito di cliccare sulla casella di controllo presente in C13.
In quanto l'inventario si estende oltre i 50 prodotti diversi, il blocco appunti Carichi, si estende ad una dozina, con la possibilità di scegliere il prodotto a caricare, al momento impostato di default su prodotti usati quotidianamente (Funzione indiretta di Remind).
Fin qui tutto funziona (Aggiorna l'inventario, resetta il blocco appunti, e la casella si resetta per il prossimo carico successivo)

Il problema:

Ho cercato in tutti i modi di integrare la possibilità di mandare la mail al momento del “Check C13”.
I permessi sono stati dati, Debug pure, prove su altri fogli. Anzi, la mail di prova la mando correttamente, anche dal medesimo foglio.
Ma non manda la tabella dei carichi ove ipotizziamo sarebbe:
"Il bar è in linea per il servizio di domani, sono stati caricati:
- 2 Casse di Acqua Panna
- 6 Coca Cola
- 3 Succhi di arancia

Cordialmente, Hugo"

Vi potrei mandare tutte le bozze eseguite sin'ora ma penso che creerei solamente confusione. 
(Tra quelle separate da OnEdit, integrate, prive di ricalcolo inventario, SendMail o GmailSend ecc) 
Ringrazio d'anticipo chi si investirà ad aiutarmi con questo problema, rimango a disposizione per qualsiasi chiarimento.

P.s.: Spero di scrivere nella sezione giusta, non sapevo se era piu opportuno su excel o in JavaScript.

1 Risposte

  • Re: Funzione ReportMail - Carichi

    Questa discussione è risolta, 
    Dopo vari tentativi tramite integrazione e autorizzazione dell'API gmail, il problema era la casella di controllo che non dispone delle autorizzazioni per mandare le mail.

    Attivando la macro pero' le manda, per mantenere ambe le funzioni, ho emesso un trigger temporale quando il foglio viene modificato, attivasse la funzione. Inizialmente mandava diverse mail man mano che venivano inseriti i dati, al quale ho sfruttato a vantagio:
    - Finchè C13 (casella di controllo) non è selezionata, non prosegui.

    Per chi interessa:

    function getEmailContent() {
      var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
      var carichiSheet = spreadsheet.getSheetByName('Carichi');
      var carichiRange = carichiSheet.getRange("B2:C12");
      var carichiData = carichiRange.getValues();
     
      var emailContent = "Report carico giornaliero:\n\n";
     
      for (var i = 0; i < carichiData.length; i++) {
        var productName = carichiData[i][0];
        var quantity = carichiData[i][1];
       
        if (productName !== "") {
          emailContent += productName + ": " + quantity + " pezzi\n";
        }
      }
     
      return emailContent;
    }
    
    
    function sendEmailReport(e) {
     if (e) {
      var sheet = e.range.getSheet();
      var sheetName = sheet.getName();
      var rangeA1 = e.range.getA1Notation();
      var recipient = "esempiodimailgmail.com"; // Sostituisci con l'indirizzo email del destinatario
      var subject = "Report carico giornaliero";
      var body = getEmailContent();
     
       if (sheetName === "Carichi" && rangeA1 === "C13" && e.value === "TRUE") {
         e.range.setValue("FALSE"); // Azzerare la casella di controllo dopo la conferma
         GmailApp.sendEmail(recipient, subject, body);
         processCarichiAndUpdateInventory();
       }
     }
    }
    
    
    function processCarichiAndUpdateInventory() {
      var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
      var carichiSheet = spreadsheet.getSheetByName('Carichi');
      var inventorySheet = spreadsheet.getSheetByName('Inventario');
    
    
      var carichiRange = carichiSheet.getRange("B2:C12");
      var carichiData = carichiRange.getValues();
    
    
      var inventoryRange = inventorySheet.getRange("B2:C");
      var inventoryData = inventoryRange.getValues();
    
    
      for (var i = 0; i < carichiData.length; i++) {
        var productName = carichiData[i][0];
        var quantity = carichiData[i][1];
    
    
        if (productName !== "") {
          for (var j = 0; j < inventoryData.length; j++) {
            if (inventoryData[j][0] === productName) {
              inventoryData[j][1] = inventoryData[j][1] - quantity;
              break;
            }
          }
        }
      }
    
    
      // Aggiorna l'inventario con le quantità aggiornate
      inventoryRange.setValues(inventoryData);
    
    
      // Azzerare la lista dei carichi
      for (var i = 0; i < carichiData.length; i++) {
        carichiData[i][1] = "";
      }
      carichiRange.setValues(carichiData);
    }
Devi accedere o registrarti per scrivere nel forum
1 risposte