1

J'essaie actuellement d'utiliser Google Apps event manager de Martin Hawksey à partir de son blog, mais je rencontre deux problèmes.Google Apps Script Event Manager

# 1) La date dans les e-mails de conformation est l'affichage de la date « aujourd'hui » & fois au lieu de la date de l'événement & temps (il est dans son original et il n'a jamais fixé il). La plupart disent a à voir avec cette section ne pas droit:

var variableData = isDate(data[normalizeHeader(templateVars[i])]); 
    email = email.replace(templateVars[i], variableData || ""); 
    } 

    return email; 
} 

// Test if value is a date and if so format 
function isDate(sDate) { 
    var scratch = new Date(sDate); 
    if (scratch.toString() == "NaN" || scratch.toString() == "Invalid Date") { 
    return sDate; 
    } 
    else { 
    return Utilities.formatDate(new Date(), TZ, "dd MMM yy HH:mm"); 
    } 
} 

# 2) Mon autre question est dans le modèle pour se joindre à des instructions que je ne peux pas appeler à des variables (ie $ { "facture "} ou $ {" Montant "} :: à la place, il retourne la date" d'aujourd'hui "< - J'ai ajouté plus de cellules et ajouté une colonne pour chacune d'entre elles et elles contiennent des données, et fait des ajustements corrects dans le script, toujours rien

ex.

Template: "Your Invoice # is: ${"Invoice"} and your total amount due is: ${"Amount"}" 
Reality: "Your Invoice # is: 13 Feb 13 13:18 and your total amount due is: 13 Feb 13 13:18." 

Voici mon script complet et les changements que j'ai faits (pas trop différent de son original): https://gist.github.com/hakarune/4985606

Toute aide serait très appréciée, la plus grande et la plus importante est cette date si .... Merci

+0

Cool gestionnaire d'événements! J'ai regardé la vidéo. Des trucs intéressants le script G pour les applications. Je ne savais pas. – powtac

+1

Ouais, c'est incroyable, je veux juste que ça marche à 100% avant de l'utiliser. – hakarune

+0

Ce script peut utiliser une optimisation, en réduisant les appels multiples à 'setValue()' en créant des tableaux et en utilisant 'setValues ​​()' à la place. Voir [Meilleures pratiques - Script Google Apps] (https://developers.google.com/apps-script/best_practices). – Mogsdad

Répondre

5

Pour le problème n ° 1, les commentaires de la fonction isDate() indiquent que si le sDate donné est une date valide, une version formatée de cette date sera renvoyée. Mais l'appel à formatDate() passe new Date(), ce qui sera la date actuelle & temps. Au lieu de cela, il devrait passer new Date(sDate).

return Utilities.formatDate(new Date(sDate), TZ, "dd MMM yy HH:mm"); 

Pour le problème # 2, semble que le problème est à nouveau avec isDate(). La fonction fillInTemplateFromObject() appelle le isDate() pour formater les données du modèle s'il s'agit d'une date, en espérant qu'il sera laissé tel quel. Le problème est que chaque numéro passera le test isDate(), puisque le test est simplement de savoir si new Date(sDate) produira une date. Voir this reference, vous verrez qu'il finirait par être traité comme new Date(milliseconds). Vous obtenez la date actuelle en raison du bug décrit ci-dessus ... corrigez cela et vous obtiendrez une date différente, mais toujours une date. Vérifiez Detecting an "invalid date" Date instance in JavaScript, il peut fournir un test plus probant, si cela fonctionne dans apps-script.

Voici une correction de isDate() pour vous d'essayer. Il inclut le correctif pour le problème n ° 1 et extrait la routine isValidDate() de Detecting an "invalid date" Date instance in JavaScript pour différencier plus précisément les dates et les nombres.

// From https://stackoverflow.com/questions/1353684 
// Returns 'true' if variable d is a date object. 
function isValidDate(d) { 
    if (Object.prototype.toString.call(d) !== "[object Date]") 
    return false; 
    return !isNaN(d.getTime()); 
} 

// Test if value is a date and if so format 
// otherwise, reflect input variable back as-is. 
function isDate(sDate) { 
    if (isValidDate(sDate)) { 
    sDate = Utilities.formatDate(new Date(sDate), TZ, "dd MMM yy HH:mm"); 
    } 
    return sDate; 
} 

Si vous êtes curieux, c'est le code de test que j'ai exécuté dans le débogueur. Les commentaires montrent ce qui a été affiché en tant que valeurs dans le débogueur.

var TZ = "GMT"; // isDate() uses a global variable for TimeZone, let's try GMT 

function myFunction() { 
    var a = new Date();  // Fri Feb 22 2013 20:48:07 GMT-0500 (EST) 
    var b = isDate(a);  // "23 Feb 13 01:48" 
    var c = 142312;   // 142312.0 
    var d = isDate(c);  // 142312.0 
    var e = 'test string'; // "test string" 
    var f = isDate(e);  // "test string" 
    var g = 'Feb 22, 2013' // "Feb 22, 2013" 
    var h = isDate(g);  // "Feb 22, 2013" 
    debugger; 
} 
+0

Merci, je vais donner un coup d'oeil demain :) – hakarune

+0

Yep qui résout problème # 1 (MERCI A LOT !!!), qui est vraiment important. En ce qui concerne la question # 2, il semble que d'après ce que vous dites et la lecture, je devrais recoder presque tout ce qui est autour de 'isDate()' afin de le réparer ... Je ne pense pas que ce soit dans mon capacité, honnêtement, je pensais qu'il aurait été plus simple de vérifier ** si ** x est une date (format req: ** mm/jj/aaaa tt: tt: tt **) puis 'Date (sDate)' [ et que fait tout cela? ** else ** pas seulement poster les mêmes données 'NaN' de la cellule .... – hakarune

+1

@hakarune - J'ai ajouté un extrait de code qui devrait faire l'affaire. C'est vraiment aussi simple que vous le décrivez. Je l'ai testé dans apps-script, et cela fonctionne. Seules les variables qui sont déjà des objets Date seront formatées - ce qui signifie qu'une chaîne "22 février 2013" resterait une chaîne, alors que la version originale l'aurait transformée en date. Pourtant, je pense que cela devrait prendre soin de vous pour vous! – Mogsdad