No puedo ejecutar Google Apps Script para mi Gmail

Oct 01 2020

Seguí el script publicado en ¿ Alguna forma de enviar la respuesta automática de Gmail en determinados momentos de la semana? . Sin embargo, mi cuenta de Gmail no respondió ningún mensaje durante las horas fuera de trabajo según mi prueba actual.

¿Hice algo incorrecto o incompleto?

Que he hecho:

  1. Creó un guión en https://script.google.com/ mediante copiar y pegar.
  2. Guardé el guión y lo probé. Funcionó bien. ingrese la descripción de la imagen aquí
function myFunction() {
  function autoReply() {
var interval = 5;    //  if the script runs every 5 minutes; change otherwise
  var date = new Date();
  var day = date.getDay();
  var hour = date.getHours();
  if ([4,5,6,0].indexOf(day) > -1 || (day == 1 && hour < 9) || (day == 3 && hour >= 17)) {
    var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
    var threads = GmailApp.search('is:inbox after:' + timeFrom);
    for (var i = 0; i < threads.length; i++) {
      if (threads[i].isUnread()){
      threads[i].reply("xxxx");
      threads[i].markRead();
      threads[i].markImportant();
      }
    }
  }
}
}
  1. Habilitado la API de Gmail a través del menú "Servicios avanzados de Google" ingrese la descripción de la imagen aquí
  2. Configure un disparador para el guión cada 5 minutos. ingrese la descripción de la imagen aquí
  3. Envió varios correos electrónicos de prueba desde otra cuenta de Gmail para ver si habría alguna respuesta automática.
  4. No modificó manualmente ningún correo electrónico recibido de otra cuenta.

¡Cualquier sugerencia será muy apreciada!

Actualización: Me pregunto por qué la siguiente secuencia de comandos en sí misma dará como resultado un error "Función de secuencia de comandos no encontrada: myFunction".

function autoReply() {
  
  // find calendar event
  var today = new Date();
  var events = CalendarApp.getDefaultCalendar().getEventsForDay(today, { search: 'OOF' });
  var unavailableToday = false;
  for (var i = 0; i < events.length; i++) {
    
    if(events[i].isAllDayEvent() && events[i].isOwnedByMe()) {
      
      unavailableToday = true;
      break;
      
    }
    
  }
  
  var myEmail = Session.getEffectiveUser().getEmail();
  
  Logger.log('unavailableToday');
  Logger.log(unavailableToday);
  if(unavailableToday === true) {
    
    // get html message
    var files = DriveApp.getRootFolder().getFilesByName('autoreply.html');
    var htmlbody;
    while (files.hasNext()) {
      var file = files.next();

      htmlbody = file.getBlob().getDataAsString('utf8');
      
    }
   
    // get emails
    var interval = 2;
    var date = new Date();
    var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
    var threads = GmailApp.search('is:inbox !label:autoresponded after:' + timeFrom);
    var label = GmailApp.getUserLabelByName("autoresponded");

    for (var i = 0; i < threads.length; i++) {
      
      var message = threads[i].getMessages()[0];
      if (message.getFrom().indexOf(myEmail) < 0 && message.getFrom().indexOf("no-repl") < 0 && message.getFrom().indexOf("bounce") < 0 && message.getFrom().indexOf("spam") < 0) {
        
        Logger.log("Replied now");
        
        // reply
        threads[i].reply("", {
          htmlBody: htmlbody
        });
        
        // label
        label.addToThread(threads[i]);
        
      }
      
    }
    
  }
  
}

¿Qué me hizo pensar que MyFunction {} es esencial?

Respuestas

3 RafaGuillermo Oct 01 2020 at 15:29

Respuesta:

Debe eliminar la autoReply()función fuera de myFunction()y activar el disparador autoReply().

Más información:

El código debería verse como en la respuesta que vinculó:

function autoReply() {
  var interval = 5;    //  if the script runs every 5 minutes; change otherwise
  var date = new Date();
  var day = date.getDay();
  var hour = date.getHours();
  if ([5,6,0].indexOf(day) > -1 || (day == 1 && hour < 8) || (day == 4 && hour >= 17)) {
    var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
    var threads = GmailApp.search('is:inbox after:' + timeFrom);
    for (var i = 0; i < threads.length; i++) {
      threads[i].reply("I am out of office. Your email will not seen until Monday morning.");
    }
  }
}

NO como esto:

function myFunction() {
  function autoReply() {
    var interval = 5;    //  if the script runs every 5 minutes; change otherwise
    var date = new Date();
    var day = date.getDay();
    var hour = date.getHours();
    if ([5,6,0].indexOf(day) > -1 || (day == 1 && hour < 8) || (day == 4 && hour >= 17)) {
      var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
      var threads = GmailApp.search('is:inbox after:' + timeFrom);
      for (var i = 0; i < threads.length; i++) {
        threads[i].reply("I am out of office. Your email will not seen until Monday morning.");
      }
    }
  }
}

autoReply()no se llama cuando llama myFunction(), solo se declara.

Deberá editar el código y luego volver a configurar su disparador para que se ejecute autoReply().

Desde w3schools :

Las funciones declaradas no se ejecutan inmediatamente. Se "guardan para su uso posterior" y se ejecutarán más tarde, cuando se invoquen (invoquen).

¡Espero que esto te sea de ayuda!

Referencias:

  • Definiciones de funciones de JavaScript - w3schools