Creation d'une date sur applescript

CathyGYM

Membre actif
28 Novembre 2010
160
1
Bonsoir,
je continue lentement mon apprentissage d'Applescript, et je suis en train de faire un script qui crée des évènements iCal à partir d'un fichier texte contenant un planning (mon planning du boulot !). La lecture du fichier texte s'effectue sans aucun problème... mais la création de l'évènement ical bloque car je lui transmet une date sous forme de chaine ; l'instruction que j'emploie est la suivante :

tell application "iCal"
tell calendar "Travail"
make new event at end with properties {description:descriptEv, summary:ObjetEv, location:LieuEv, start date:dateDebEvent, end date:dateFinEvent}
end tell
end tell

Toutes les variables DescriptEv, ObjetEv, LieuEv, dateDebEvent et dateFinEvent sont des chaines de caractères définies plus haut dans le script et validées par des display dialog (dateDebEvent vaut "2010-12-21 06:00:00" et dateFinEvent vaut "2010-12-21 07:30:00")

Comme celà plantait, j'ai essayé de créer une date, et de lui modifier les propriétés "date string" et "time string" de façon à récuperer les bonnes dates en format date, mais celà plante encore (message saturation de pile).

set DateDeb to my TransfoDate(DateDebEvent)
set DateFin to my TransfoDate(DateFinEvent)
.
.
.
on TransfoDate(ChaineDate)
set DateLoc to text 1 thru 10 of ChaineDate
set HeureLoc to text 11 thru end of ChaineDate
set DateTransfo to current date
set date string of DateTransfo to DateLoc
set time string of DateTransfo to HeureLoc
return DateTransfo
end TransfoDate

Quelqu'un pourrait-il me dire ce qui cloche ?
Question subsidiaire : existe-t-il une fonction qui permet d'éliminer les espaces en début ou en fin de chaine (un peu comme le "trim" de real basic?)

Merci d'avance
:zen:
 
Bonjour,

Si ton format de date dans les préférences systèmes --> International --> "Formats" est comme cette chaîne "2010-12-21 06:00:00", il suffit de faire comme ceci* :
Bloc de code:
set dateDeb to date "2010-12-21 06:00:00"

Sinon il faut récupérer les nombres.
date string et time string ne sont pas des propriétés d'une date, mais une fonction qui convertit une partie de l'objet date en texte.
Bloc de code:
set DateDeb to my stringToDate("2010-12-21 06:00:00")
set DateFin to my stringToDate("2010-12-21 07:30:00")

on stringToDate(theString)
	try
		tell theString to set tList to {text 1 thru 4, text 6 thru 7, text 9 thru 10, text 12 thru 13, text 15 thru 16, text 18 thru 19}
		tell (current date)
			set {its year, its month, its day, its hours, its minutes, its seconds} to tList
			return it
		end tell
	on error
		return "Le texte ne contient pas une date valide"
	end try
end stringToDate


Il n'existe pas de fonction trim en AppleScript.
Mais c'est possible d'utiliser un shell ou d'ajouter une routine dans ton script.

Exemple de routine qui supprime-les (espaces et tabulation) au début et à la fin d'une chaîne
Bloc de code:
set mon_texte to "  	  foo   éèà:bar:   bar:foo  		"
set mon_texte to my delete_Space_Tab(mon_texte)

on delete_Space_Tab(T)
	repeat while character 1 of T is in " 	"
		set T to T's text 2 thru -1
	end repeat
	repeat while last character of T is in " 	"
		set T to T's text 1 thru -2
	end repeat
	return T
end delete_Space_Tab

Exemple qui utilise un do shell script
Bloc de code:
set mon_texte to "  	  foo   éèà:bar:   bar:foo  		"
set mon_texte to my delete_trailing_leading_whiteSpaces(mon_texte)

on delete_trailing_leading_whiteSpaces(T)
	do shell script "var=" & quoted form of T & "; var=\"${var#${var%%[![:space:]]*}}\"; echo \"${var%${var##*[![:space:]]}}\""
end delete_trailing_leading_whiteSpaces
Voici d'autres commandes do shell script alternatives
Bloc de code:
do shell script "/usr/bin/sed -E  \"s/^[[:space:]]*//;s/[[:space:]]*$//\" <<<" & quoted form of T
	-- ou ceci-- do shell script "/usr/bin/php -r " & (quoted form of "print trim($argv[1]);") & " " & quoted form of T
 
Merci beaucoup Mac_Jac, j'ai testé çà marche super...:D:D:D:up:
J'avais détecté un problème du aux espaces en début de chaine et en j'avais fait une première procédure pour éliminer les espaces (avant et après, un peu comme la fonction trim de VB et RB), mais la tienne est mieux car elle tient compte des tabs, ce à quoi je n'avais pas pensé...
Je donne quand même le code de ma procédure, çà pourra peut-être servir à d'autres :;)

-- Procédure de suppression des espaces en début et fin de chaine de caractères
on trim(ChaineLoc)
if ((length of ChaineLoc) is not equal to 0) then
repeat
if character 1 of ChaineLoc is equal to " " then
set ChaineLoc to text 2 thru end of ChaineLoc
else
exit repeat
end if
end repeat
repeat
if last character of ChaineLoc is equal to " " then
set ChaineLoc to text 1 thru ((length of ChaineLoc) - 1) of ChaineLoc
else
exit repeat
end if
end repeat
end if
return ChaineLoc
end trim

Merci encore