Traduction d'une macro VBA en macro Apps Script Google Sheet

Bonjour,

j'utilise en tant qu'enseignant un fichier Excel pour renseigner des données journalières pour chacun de mes élèves sur une année scolaire.

Ma première colonne est figée et les autres colonnes (qui correspondent à chaque jour de la semaine) sont mobiles. L'idée est d'avoir une solution pour qu'à l'ouverture du document, les colonnes mobiles se placent directement à la date du jour et non pas à la première colonne créée en début d'année car cela demande de déplacer le curseur manuellement et en fin d'année cela prend un peu de temps pour chaque élève.

Un ami m'a aidé et a réussi à créer une macro VBA pour résoudre mon soucis.

Par contre je souhaite utiliser cette option sur le drive de google et la macro VBA n'est pas reconnue.

Je n'y connais strictement rien en langage VBA ou Apps Script.

Quelqu'un pourrait-il m'aider à traduire ma macro VBA en Apps Script?

Voici le code de ma macro VBA :

Sub OK()
Const lidate = 2
Dim obj As Object, d As Date
d = Date
Set obj = Rows(lidate).Find(d, , , xlWhole)
If Not obj Is Nothing Then obj.Select

 End Sub

Voici mon fichier Excel (je dois cliquer sur "Date du jour" pour que mes colonnes mobiles se déplacent sur la date du jour actuel) :

J'espère avoir été clair dans mes explications de novice.

Merci beaucoup

Bonjour Pommier et

Une petite présentation ICI serait la bienvenue

Si vous ne l'avez pas encore fait, je vous invite à lire la charte du forum [A LIRE AVANT DE POSTER]
qui vous aidera dans vos demandes et réponses sur ce forum

Ainsi que sur les fonctionnalités (Nouveau Forum au bas de page notamment)

Concernant votre demande, j'ai déplacé le sujet dans le bon forum

Merci de votre participation

Cordialement

Bonjour Pommier, bonjour Bruno,

As-tu un fichier GSheets à partager (comme suit https://www.sheets-pratique.com/fr/cours/partage )

Voici un script qui t'amènera directement au jour à l'ouverture

function onOpen() {
  gotoJour();
}

function gotoJour() {
  const onglet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  const aujourdhui = new Date();
  const jour = new Date(aujourdhui.getFullYear(), aujourdhui.getMonth(), aujourdhui.getDate()).valueOf()
  const calend = onglet.getRange('2:2')
    .getValues()
    .flat()
    .splice(1)
    .map(r => r.valueOf())
  onglet.setActiveSelection(onglet.getRange(2, +calend.indexOf(jour) + 2).getA1Notation())
}

https://docs.google.com/spreadsheets/d/1k-n3rA0v3wd6a4Q__NHk-63Kpue7dT7HIiFxO2QItbg/edit?usp=sharing

Bonsoir Steelson,

merci d'avoir pris le temps de me répondre et de me proposer une solution.

Désolé pour le temps de réponse!

J'ai essayé d'inscrire le script dans une macro mais je ne pense pas que ma démarche ait été une réussite.

J'ai dû faire une erreur

Voici le lien de partage de mon fichier

https://docs.google.com/spreadsheets/d/1CT6hLSiPerFFyYPpmN3fQwJQe_0BvB9WvFCpd34ZagM/edit?usp=sharing

Merci beaucoup

tes timezone ne sont pas cohérents entre feuille et éditeur de script

image

et

image

J'ai changé mes timezone mais quand j'ouvre mon fichier, les colonnes "date" sont toujours positionnées à l'identique et non pas sur la date actuelle.

tu es en GMT d'un côté et en pacific time de l'autre

je vais voir pour rendre le script indépendant de cela

essaie comme ceci, cela doit être tolérant aux écarts

/** @OnlyCurrentDoc */

function onOpen() {
  gotoJour();
}

function gotoJour() {
  const onglet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  const aujourdhui = new Date();
  const jour = aujourdhui.getFullYear() + '-' + aujourdhui.getMonth() + '-'+ aujourdhui.getDate()
  const calend = onglet.getRange('2:2')
    .getValues()
    .flat()
    .splice(1)
    .map(r => (r.getFullYear() + '-' + r.getMonth() + '-'+ r.getDate()))
  onglet.setActiveSelection(onglet.getRange(2, +calend.indexOf(jour) + 2).getA1Notation())
}

Bonjour Steelson,

ton script fonctionne pour mon premier onglet !!!!

Trop fort

Il n'est pas pris en compte pour les onglets suivants (j'en ai un par jeune soit une vingtaine d'onglets).

Y a t'il quelque chose à rajouter dans le script pour que cela soit actif pour tous les onglets et même les futurs qui seront créés?

Merci à toi

Bonne journée

Pour info, si je clique sur un autre onglet, et que j'actualise la page, le script fonctionne mais les onglets précédents revienne à leur position initiale.

On ne peut pas capter le changement d'onglet. Donc, soit on le fait à l'ouverture en balayant tous les onglets, soit on fait un menu à cliquer quand on change d'onglet. Je crois qu'il faut afficher chaque onglet pour le premier point, je vais faire un test.

Voici

/** @OnlyCurrentDoc */

function onOpen() {
  gotoJour();
}

function gotoJour() {
  const aujourdhui = new Date();
  const jour = aujourdhui.getFullYear() + '-' + aujourdhui.getMonth() + '-' + aujourdhui.getDate()
  SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(onglet => {
    const calend = onglet.getRange('2:2')
      .getValues()
      .flat()
      .splice(1)
      .map(r => (r.getFullYear() + '-' + r.getMonth() + '-' + r.getDate()))
    onglet.setActiveSelection(onglet.getRange(2, +calend.indexOf(jour) + 2).getA1Notation())
  })
}

Merci à toi Steelson pour toute cette démarche.

Je suis vraiment super content de ce script qui va me faciliter mon quotidien.

Bonne journée à toi et encore merci

Je viens de voir que sur 22 onglets, seuls les six premiers et le dernier sur pris en compte par la macro.

Les quinze onglets qui se trouvent après le sixième n'ont pas été pris en compte et les colonnes ne se positionnent pas à la date du jour.

Merci

Est-ce qu'elles respectent bien le même calendrier à la même position ?

Quelles sont les différences entre onglets ?

Est-il possible de partager ? a minima un onglet qui ne "fonctionne" pas !

les onglets commencent soit au 27 septembre soit au 15 novembre (tous ceux au 27/09 fonctionnent et certains du 15/11 fonctionnent et d'autres non)

Je pensent qu'ils respectent les mêmes caractéristiques (j'ai dupliqué les onglets)

voici mon fichier : https://docs.google.com/spreadsheets/d/1cVequdn-Y20cd04olu_VaN_lEdAkTy-lYbGueI1QP_4/edit?usp=sharing

curieux ! une correction

/** @OnlyCurrentDoc */

function onOpen() {
  gotoJour();
}

function gotoJour() {
  const aujourdhui = new Date();
  const jour = aujourdhui.getFullYear() + '-' + aujourdhui.getMonth() + '-' + aujourdhui.getDate()
  SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(onglet => {
    const calend = onglet.getRange('2:2')
      .getValues()
      .flat()
      .splice(1)
      .map(r => (r.getFullYear() + '-' + r.getMonth() + '-' + r.getDate()))
    onglet.getRange(2, +calend.indexOf(jour) + 2).activate();
    console.log([onglet.getName(), onglet.getRange(2, +calend.indexOf(jour) + 2).getA1Notation()])
    Utilities.sleep(100)
  })
}

l'autre solution reste de le faire avec un menu à activer

/** @OnlyCurrentDoc */

function onOpen() {
  SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
    .addItem("👉 Aller à aujourd'hui ...", 'gotoJour')
    .addToUi();
}

function gotoJour() {
  const aujourdhui = new Date();
  const jour = aujourdhui.getFullYear() + '-' + aujourdhui.getMonth() + '-' + aujourdhui.getDate()
  const onglet = SpreadsheetApp.getActiveSheet()
  const calend = onglet.getRange('2:2')
    .getValues()
    .flat()
    .splice(1)
    .map(r => (r.getFullYear() + '-' + r.getMonth() + '-' + r.getDate()))
  onglet.getRange(2, +calend.indexOf(jour) + 2).activate();
}

La solution avec le menu à activer fonctionne parfaitement. Je vais garder celle-là.

Le correctif pour la version automatique reste aléatoire et ne fonctionne pas pour tous les onglets.

Merci à toi

Rechercher des sujets similaires à "traduction macro vba apps script google sheet"