Manipulation de date de base dans le script Google

11

Je souhaite définir une fonction personnalisée dans Google Sheet. Cette fonction devrait faire quelque chose de très simple, mais je n'ai pas réussi à trouver comment le faire. Je suis très confus avec toutes les réponses que j'ai lues parce que je ne trouve pas de référence claire sur le traitement des dates dans les scripts Google.

D'après ce que je comprends, les manipulations de base des dates peuvent être effectuées avec:

  • new Date(): d'après ce que je comprends, il définit un objet qui a des propriétés. Je ne sais pas comment utiliser la date d'une cellule et la convertir en un tel objet.
  • Utilities.formatDate(): il s'agit de changer le format de la date vue sous forme de chaîne .
  • la bibliothèque Moment( http://momentjs.com/ )

En fin de compte, comment puis-je entrer deux dates (par exemple 31/01/2016) et, par exemple, trouver le maximum entre les deux et extraire le mois du premier?

function myfun(date1,date2) {  
   // month = month of date 1
   // return maximum(date1,date2);  
}

Je suis également intéressé si quelqu'un peut expliquer les grandes lignes du traitement des dates ou indiquer une bonne référence.

anderstood
la source
Je vous remercie. N'y a-t-il pas d'autre moyen? Il semble incroyablement compliqué d'extraire, par exemple, le mois d'une date! De plus, il doit tenir compte du fuseau horaire ... C'est un peu tordu pour les opérations de date simples (fixes).
anderstood
J'ai ajouté une réponse focalisée dans le code de l'affaire qui a été exposée, mais la question est large (manipulation de date). Vous devriez peut-être commencer par rechercher des extraits de code JavaScript et des cours en ligne.
Rubén
@ Rubén je comprends. Je ne voulais pas poser de question "écrire du code pour moi" et je cherchais donc des informations générales que je n'ai pas vraiment trouvées. Le message de Sergei insas que vous avez indiqué est utile.
anderstood
Pour les informations générales sur JavaScript, voir developer.mozilla.org/en-US/docs/Web/JavaScript et pour Google Apps Script, voir developers.google.com/apps-script .
Rubén

Réponses:

14

Obtention et définition de valeurs datetime

Chaque fois que votre script appelle .getValue()une cellule formatée en date, date-heure ou durée, il obtient un objet Date JavaScript . Vous pouvez ensuite appliquer diverses méthodes répertoriées sur cette page MDN à cet objet, y compris getMonth()pour le mois. Exemple:

  var sheet = SpreadsheetApp.getActiveSheet();
  var value = sheet.getRange('A1').getValue();  // is a Date object
  Logger.log([value.getMonth(), value.getHours(), value.getUTCHours()]); 
  // examples of available methods

Inversement, vous pouvez affecter un objet Date à une cellule à l'aide de setValue, et il sera automatiquement formaté comme tel.

  sheet.getRange('B2').setValue(new Date());  // current timestamp

Fuseaux horaires

L'horodatage dans Google Sheets se trouve dans le fuseau horaire local, qui est défini via Fichier> Paramètres de la feuille de calcul. Le script fonctionne également dans un fuseau horaire, qui peut être différent et se trouve sous Fichier> Propriétés du projet dans l'éditeur de script. Si ces fuseaux horaires ne correspondent pas, vous aurez un problème avec les horodatages.

Pour vérifier si les fuseaux horaires correspondent, vous pouvez soit comparer les deux manuellement, soit faire quelque chose comme ceci:

var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange('A1').setFormula('=date(2015,1,1)');
Logger.log(sheet.getRange('A1').getValue().getHours());

Cela entre la formule =date(2015,1,1)dans la cellule A1. Le résultat sera le 2015-01-01 00:00:00 dans le fuseau horaire de la feuille de calcul. Le script obtient ensuite la date et extrait les heures dans l'heure locale du script. Si les fuseaux horaires sont d'accord, vous devriez voir 0.0 dans le journal.


la source
4

Réponse courte

Ci-dessous, deux fonctions personnalisées sont présentées comme des exemples de la façon dont Google Sheets et Google Apps Script peuvent fonctionner avec les dates.

Exemple 1: obtenir la date la plus récente

obtenir la date la plus récente

function myFunction(date1,date2) {
  return new Date(Math.max(date1,date2)) 
}

Exemple 2: obtenir le mois de la date la plus récente

function myFunction2(date1,date2) {
  var date = new Date(Math.max(date1,date2));
  return date.getMonth();
}

Brève explication

Dans le premier exemple, la méthode JavaScript Math.max fait le travail.

Si vous souhaitez obtenir une date comme résultat, un objet date est créé en utilisant new Date () .

Dans le deuxième exemple, un objet date est affecté à une variable, puis la méthode JavaScript getMonth () est utilisée pour obtenir l'index du mois. Gardez à l'esprit que JavaScript est utilisé 0comme élément de départ 0pour janvier, 1février et ainsi de suite.

Références

Rubén
la source
i) Sont date1- ils date2passés sous forme de nombres (généralement: 54243)? ii) J'ai maintenant essayé d'extraire le mois d' date2utilisation, date2.getMonth()mais lorsque la cellule est, 01/12/2015elle renvoie 10 et 11 pour 02/12/2015. Je suppose que c'est à cause du fuseau horaire. La fonction de feuille month()est tellement plus simple.
anderstood
Google Sheets gère les dates sous forme de numéros sérialisés identiques à JavaScript, mais chacune a une date de début différente. Donc, si vous souhaitez utiliser les fonctions de date JavaScript, vous devez d'abord convertir la date de la feuille de calcul en date JavaScript. Comme vous l'avez déjà remarqué, le chemin le plus simple consiste à utiliser les fonctions de feuille de calcul pour gérer les dates de feuille de calcul et les fonctions JavaScript pour gérer les dates JavaScript.
Rubén
@anderstood: J'ai ajouté un deuxième exemple.
Rubén
Merci encore. Concernant le deuxième exemple, comme je l'avais écrit, quand le max est 01/12/2015 myfunction2retourne 10 et quand le max est 02/12/2015, il retourne 11. Alors que je suis OK avec le 11, je ne comprends pas pourquoi renvoie 10 pour le 01/12/2015. Comme je l'ai dit, je crois que cela est dû à GMT mais je ne suis pas sûr. Suis-je en train de manquer quelque chose?
anderstood
@anderstood: créez une feuille de calcul de démonstration, partagez-la avec toute personne disposant du lien pour consultation uniquement et publiez une nouvelle question, y compris le lien vers la feuille de calcul de démonstration.
Rubén