Utiliser une cellule au format date

367 views
Skip to first unread message

leonfort fas

unread,
Oct 31, 2022, 4:55:21 AM10/31/22
to Google Apps Script Community
Bonjour
je dois modifier l'année +1 d'une plage de cellule qui se trouve à quatrième colonne.
Voilà ce que je fais, et qui ne fonctionne pas (c'est ma première macro...), erreur de syntaxe, mais quelle est le bon format ?

function getStudents() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Adhérent');
  for(value of sheet.getDataRange().getValues()){
      var d = Date().value[3];   'c est ici que je voudrais récupérer l contenu de la cellule'
      var year = d.getFullYear();
      month = d.getMonth(); 
      day = d.getDate(); 
      c = new Date(year + 1, month, day); 

  console.log(value[3]);
  console.log(c + ' ' +value[3]);
  }
}

Merci à vous tous pour vos conseils
Leo

Andrew Apell

unread,
Oct 31, 2022, 5:27:48 AM10/31/22
to Google Apps Script Community
To retrieve values, your variables should follow this format:

let a = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Adhérent'); // Identifies the sheet
let b =  sheet.getDataRange().getValues(); // Stores values from the spreadsheet
let c = b[0][2]; // Reads the value found in the first row and the third column

Your adjustments should be performed on the data stored in the "b" variable.

To write back to the spreadsheet, you will need to write something like this:

a.getRange(1, 1, b.length, b[0].length).setValues(b); // Rewrites your updates data to the entire sheet

I'm sure there are more nuanced ways of doing this, but this is my contribution for now.

leonfort fas

unread,
Oct 31, 2022, 5:46:02 AM10/31/22
to google-apps-sc...@googlegroups.com
Merci Andrew
en fait je voudrais extraire d'une cellule contenant une date, l'année, le mois et le jour, pour ensuite la recomposer et l'inscrire dans la même cellule.
Votre proposition permet de lire le contenu d'une cellule, elle est sûrement meilleure que la mienne.
Il reste à décomposer le contenu en année, mois et jour. Et c'est ça que je cherche à faire
Il doit y avoir une instruction équivalente à excel pour décomposer un champ date

 Décomposer une date : ANNEE(), MOIS() et JOUR()
  1. La formule ANNEE() permet d'extraire l'année d'une date passée en paramètre,
  2. La formule MOIS() permet d'extraire le mois d'une date passée en paramètre,
  3. La formule JOUR() permet d'extraire le jour d'une date passée en paramètre,

Merci pour vos suggestions.

--
You received this message because you are subscribed to a topic in the Google Groups "Google Apps Script Community" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/google-apps-script-community/5zEvLSKcPdg/unsubscribe.
To unsubscribe from this group and all its topics, send an email to google-apps-script-c...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-apps-script-community/d6a0cd00-d7e7-438e-868d-28b901f7570fn%40googlegroups.com.

Andrew Apell

unread,
Oct 31, 2022, 7:17:57 AM10/31/22
to Google Apps Script Community
To expand my previous example. Let us assume your date values are in column B:

1. If you don't mind using a custom function >

function getStudents(a) {
let b = (a.getFullYear() + 1) + "," + a.getMonth() + "," + a.getDate();
return b;
};

Assuming you would like to change the date in B3, simply type =getStudents(B3) inside a new cell. This will write the reformatted date inside that new cell.

2. If you would like something closer to your previous solution > 

function getStudents() {
let a = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Adhérent"), b = a.getDataRange().getValues(), c, d;
for (let i = 0; i < b.length; i++){
c = b[i][1], 
d = (a.getFullYear() + 1) + "," + c.getMonth() + "," + c.getDate();
b[i].splice(1, 1, d);
}
a.getRange(1, 1, b.length, b[0].length).setValues(b);
};

Either way, you should get the results you want.

.. but look out for potential errors. In this example, I assumed that the entire column B is filled with date values. If this is not the case, the functions I wrote might fail.
Secondly, if multiple people are accessing this script, you will need to employ the LockService to prevent conflicts.

leonfort fas

unread,
Oct 31, 2022, 7:32:30 AM10/31/22
to google-apps-sc...@googlegroups.com
Super
mais à l'execution j'ai ceci 
image.png

--
You received this message because you are subscribed to the Google Groups "Google Apps Script Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-apps-script-c...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-apps-script-community/41c47785-f2bb-4e29-bfe3-ee6111a5ca06n%40googlegroups.com.

Andrew Apell

unread,
Oct 31, 2022, 7:43:35 AM10/31/22
to Google Apps Script Community
Sorry, there is an error here: (a.getFullYear() + 1);

Try this instead >

function getStudents() {
let a = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Adhérent"), b = a.getDataRange().getValues(), c, d;
for (let i = 0; i < b.length; i++) {
c = b[i][1], 
d = (1 + c.getFullYear()) + "," + c.getMonth() + "," + c.getDate();
b[i].splice(1, 1, d);
}
a.getRange(1, 1, b.length, b[0].length).setValues(b);
};

leonfort fas

unread,
Oct 31, 2022, 8:54:10 AM10/31/22
to google-apps-sc...@googlegroups.com
Je crois  que l'erreur vient de l'initialisation de la boucle let i=1 et non = 0
J'ai bien des dates sur la colonne B, mais il y a quelque chose d'étrange
Mon tableau 
image.png

et le résultat de la macro donne ceci
image.png

Le mois devient 11 au lieu de garder 12 et le jour 30 au lieu de 31
Etrange. Auriez vous une idée ? 
Excusez moi c'est ma première traduction d'une macro Excel,en Google script, et je ne connais pas assez de fonctions, mais quel est le rôle de l'instruction splice ?
Merci encore


Le lun. 31 oct. 2022 à 12:43, Andrew Apell <chis...@gmail.com> a écrit :
Sorry, there is an error here: (a.getFullYear() + 1);

Try this instead >

function getStudents() {
let a = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Adhérent"), b = a.getDataRange().getValues(), c, d;
for (let i = 0; i < b.length; i++) {
c = b[i][1], 
d = (1 + c.getFullYear()) + "," + c.getMonth() + "," + c.getDate();
b[i].splice(1, 1, d);
}
a.getRange(1, 1, b.length, b[0].length).setValues(b);
};

On Monday, 31 October 2022 at 14:32:30 UTC+3 asreuni...@gmail.com wrote:
Super
mais à l'execution j'ai ceci 
image.png

Andrew Apell

unread,
Oct 31, 2022, 11:07:45 AM10/31/22
to Google Apps Script Community
  • You are right. By initialising i at 0 instead of 1, the function is trying to process the word "Nom" as a date. That is why I said that if it finds something that is not a date, it might throw an error. The solution, of course, it to initialise i at 1.
  • getMonth() returns values from 0 to 11, so December would be 11. To fix this, simply adjust the function to read like this > (1 +  c.getMonth()).
  • getDate() should be fine. I don't see why it is one day behind.
  • I'm using the splice function to replace the old date format with the new format. Please click here to learn how to use the function. It is quite powerful.

leonfort fas

unread,
Oct 31, 2022, 2:46:28 PM10/31/22
to google-apps-sc...@googlegroups.com
J'ai modifié la mise en page de la date pour obtenir un format aux normes françaises, comme ceci
image.png
Il y a un problème : l'exécution ne s'arrête pas. 
La mise à jour du champ "validité" voir mail précédent, ne s'effectue pas, bizarre n'est-ce pas ?
Pourtant 
a.getRange(11b.lengthb[0].length).setValues(b);
devrait faire le job. 


Le lun. 31 oct. 2022 à 16:07, Andrew Apell <chis...@gmail.com> a écrit :
  • You are right. By initialising i at 0 instead of 1, the function is trying to process the word "Nom" as a date. That is why I said that if it finds something that is not a date, it might throw an error. The solution, of course, it to initialise i at 1.
  • getMonth() returns values from 0 to 11, so December would be 11. To fix this, simply adjust the function to read like this > (1 +  c.getMonth()).
  • getDate() should be fine. I don't see why it is one day behind.
  • I'm using the splice function to replace the old date format with the new format. Please click here to learn how to use the function. It is quite powerful.
On Monday, 31 October 2022 at 15:54:10 UTC+3 asreuni...@gmail.com wrote:
Je crois  que l'erreur vient de l'initialisation de la boucle let i=1 et non = 0
J'ai bien des dates sur la colonne B, mais il y a quelque chose d'étrange
Mon tableau 
image.png

et le résultat de la macro donne ceci
image.png

Le mois devient 11 au lieu de garder 12 et le jour 30 au lieu de 31
Etrange. Auriez vous une idée ? 
Excusez moi c'est ma première traduction d'une macro Excel,en Google script, et je ne connais pas assez de fonctions, mais quel est le rôle de l'instruction splice ?
Merci encore


leonfort fas

unread,
Oct 31, 2022, 3:02:15 PM10/31/22
to google-apps-sc...@googlegroups.com
Désolé, tout fonctionne bien. C'est que ma table fait plusieurs milliers de lignes et il fallait attendre la fin du script.
Encore merci beaucoup Andrew

Le lun. 31 oct. 2022 à 19:46, leonfort fas <asreuni...@gmail.com> a écrit :
J'ai modifié la mise en page de la date pour obtenir un format aux normes françaises, comme ceci
image.png
Il y a un problème : l'exécution ne s'arrête pas. 
La mise à jour du champ "validité" voir mail précédent, ne s'effectue pas, bizarre n'est-ce pas ?
Pourtant 
a.getRange(11b.lengthb[0].length).setValues(b);
devrait faire le job. 


Andrew Apell

unread,
Oct 31, 2022, 3:34:01 PM10/31/22
to Google Apps Script Community
You're welcome.

leonfort fas

unread,
Nov 1, 2022, 5:42:44 AM11/1/22
to google-apps-sc...@googlegroups.com
Hi Andrew
désolé de vous déranger encore une fois.
Hier soir tout fonctionnait bien et ce matin plus rien, pourtant je n'ai rien modifié, voici le compte-rendu de l'exécution

image.png
Tout ce qui dans la boucle For ne s'exécute pas , bizarre n'est-ce pas. La macro n'a pas changée
Auriez-vous une idée ? Merci d'avance 

Le lun. 31 oct. 2022 à 20:01, leonfort fas <asreuni...@gmail.com> a écrit :
Désolé, tout fonctionne bien. C'est que ma table fait plusieurs milliers de lignes et il fallait attendre la fin du script.
Encore merci beaucoup Andrew

Andrew Apell

unread,
Nov 1, 2022, 7:03:41 AM11/1/22
to Google Apps Script Community
Good day Leonfort!
I see an issue in your code. Change b.lenght to b.length.

That should fix it.

leonfort fas

unread,
Nov 1, 2022, 7:14:54 AM11/1/22
to google-apps-sc...@googlegroups.com
C'est vrai, c'est OK. J'avais effectivement modifié l'instruction et mal recopié.
Dommage que le débogage ne signale ce genre d'erreur de syntaxe.
Merci beaucoup

Le mar. 1 nov. 2022 à 12:03, Andrew Apell <chis...@gmail.com> a écrit :
Good day Leonfort!
I see an issue in your code. Change b.lenght to b.length.

That should fix it.

On Tuesday, 1 November 2022 at 12:42:44 UTC+3 asreuni...@gmail.com wrote:
Hi Andrew
désolé de vous déranger encore une fois.
Hier soir tout fonctionnait bien et ce matin plus rien, pourtant je n'ai rien modifié, voici le compte-rendu de l'exécution

image.png
Tout ce qui dans la boucle For ne s'exécute pas , bizarre n'est-ce pas. La macro n'a pas changée
Auriez-vous une idée ? Merci d'avance 

Andrew Apell

unread,
Nov 1, 2022, 7:20:18 AM11/1/22
to Google Apps Script Community
Cet IDE est très jeune... Il y a encore beaucoup de travail à faire.
Reply all
Reply to author
Forward
0 new messages