web-dev-qa-db-fra.com

Comment gérer trois fuseaux horaires différents: dans les feuilles, dans Google Apps Script et dans le calendrier?

Je veux obtenir du temps avec les titres des cellules (sans fuseau horaire) et créer des événements dans un calendrier.

Title/Subject   Start Times End Times
Board meeting   10/22/2017 13:00:00 10/22/2017 14:00:00
Team meeting    10/22/2017 10:00:00 10/22/2017 11:00:00

Impossible de trouver la méthode formatDate(string,string,string)

var data = sheet.getDataRange().getValues();

renvoie des chaînes, après conversion en date avec un nouveau Date(data[1][1]) j'ai un fuseau horaire provenant d'une feuille de calcul plus un fuseau horaire provenant d'un script. Comment puis-je l'insérer dans un calendrier avec un fuseau horaire différent juste pour être 10/22/2017 13:00:00?

1
John Smith

Je comprends que vous souhaitiez que l’heure de l’événement regarde soit la même chose dans le calendrier que dans le tableur, malgré toutes les différences de temps.

La première chose à faire est d’utiliser getDisplayValues() au lieu de getValues(). Cela retourne une chaîne qui correspond à ce que vous voyez dans la feuille de calcul. pas un objet de date. Cela supprime le fuseau horaire de la feuille de calcul.

Le fuseau horaire du script est toujours dans l'image, car il sera utilisé lorsque nous analyserons la chaîne de date avec new Date(). Pour réconcilier le résultat avec le fuseau horaire du calendrier (appelé calZone ci-dessous), je fais le calcul suivant:

  var d = new Date();
  var d1 = new Date(Utilities.formatDate(d, calZone, "yyyy-MM-dd'T'HH:mm:ss"));
  var offset = d.valueOf() - d1.valueOf(); 

L'idée est que d1 est la date d qui est convertie en texte dans le fuseau horaire du calendrier, puis analysée à nouveau à l'aide de la zone de script. La différence entre d et d1 correspond donc au décalage (en microsecondes) entre les deux fuseaux horaires. J'utilise ce décalage pour ajuster les heures de début et de fin de l'événement.

La fonction complète, créant un événement pour les dates/heures de début/fin fournies dans les cellules A1 et B1:

function createEvents() {
  var times = SpreadsheetApp.getActiveSheet().getRange("A1:B1").getDisplayValues();
  var cal = CalendarApp.getDefaultCalendar();
  var calZone = cal.getTimeZone();

  var d = new Date();
  var d1 = new Date(Utilities.formatDate(d, calZone, "yyyy-MM-dd'T'HH:mm:ss"));
  var offset = d.valueOf() - d1.valueOf(); 

  var start = new Date(new Date(times[0][0]).valueOf() + offset);
  var end = new Date(new Date(times[0][1]).valueOf() + offset);    
  cal.createEvent("test event", start, end);
}
1
user135384