Renommer des fichiers en fonction de cellules Excel

#iTech

Codeur du dimanche
29 Octobre 2023
18
1
Île-de-France — Antony
Bonjour,

J'ai 418 fichiers script (.scpt) vierges, nommés pour l'instant "script[numéro, en partant de 1]".
J'ai aussi un classeur Excel qui possède 418 cellules (une par ligne), chacune comportant du texte.
Est-il possible de donner un nom à chacun des fichiers en fonction de la valeur texte de chaque cellule (cela m'éviterait de le faire à la main...) ?Capture d’écran 2023-12-19 à 19.36.10.png
 
Pourquoi avoir autant de script ?
J’ai l’impression qu’un seul script suffit et qu’il faudrait passer un argument.

Sinon, pour renommer, itere sur les lignes de ta feuille Excel, vérifie à supprimer les caractères spéciaux et defini le nom de fichier. A priori la ligne est le numéro du script, +-1
 
Pourquoi avoir autant de script ?
J’ai l’impression qu’un seul script suffit et qu’il faudrait passer un argument.

Sinon, pour renommer, itere sur les lignes de ta feuille Excel, vérifie à supprimer les caractères spéciaux et defini le nom de fichier. A priori la ligne est le numéro du script, +-1
Je code une app en Swift et celle-ci doit faire appel à une app AppleScript.
Étant débutant / intermédiaire en Swift, comment passer un argument entre ces deux entités ? :shy:
 
Pourquoi avoir autant de script ?
J’ai l’impression qu’un seul script suffit et qu’il faudrait passer un argument.

Sinon, pour renommer, itere sur les lignes de ta feuille Excel, vérifie à supprimer les caractères spéciaux et defini le nom de fichier. A priori la ligne est le numéro du script, +-1
Euuh... Je ne suis pas sûr de comprendre la manipulation à faire pour renommer les fichiers...
 
Bonjour,

Si le nom des fichiers a renommer est bien "script1.scpt" et pas "script001.scpt" alors le petit script ci dessous devrait te renommer tes 418 fichiers.
Il faut bien sur 418 lignes dans excel avec les nouveaux noms dans la colonne "A"
Il faut dans le dossier des scripts , 418 scripts , "script1 , script2 , script3 , ......script418"

pour utiliser ce script:
Ouvrir l’application “Editeur de script” qui est dans Application—>Utilitaires
Choisir le bouton en bas à gauche “Nouveau document”, dans la fenêtre qui s’ouvre faire un copier-coller du script.
Cliquer sur le bouton "triangle play" en haut à droite “Exécuter”

Le script à été fait en vitesse sans aucune vérification d'erreur, mais il ne doit servir qu'une seule fois !

Au lancement il te demande de choisir le fichier excel contenant la liste des nouveaux noms en colonne "A"
puis il te demande de choisir le dossier contenant tes 418 scripts...
Il te prévient lorsqu'il a terminé.

Bloc de code:
tell application "Finder"
    set lefichier to choose file with prompt "Sélectionner le fichier excel"
    set nom to lefichier as string
    set lesscripts to choose folder with prompt "Sélectionner le dossier des scripts"
end tell

tell application "Microsoft Excel"
    open nom -- ouvre le fichier
  
    repeat with i from 1 to 418
        set lacasenom to "A" & i
        set lavaleur1 to value of range lacasenom --cellule à copier
      
        set lesscripts to lesscripts as string -- chemin au format string
        set lescript to lesscripts & "script" & i & ".scpt" --nom complet du fichier a renommer
      
        set lescript to lescript as alias -- chemin du fichier a renommer
        tell application "Finder"
            set name of lescript to lavaleur1 & ".scpt" --renomme
        end tell
      
    end repeat
end tell


tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
Dernière édition:
  • J’aime
Réactions: #iTech et Dreambox62
Bonjour,

Si le nom des fichiers a renommer est bien "script1.scpt" et pas "script001.scpt" alors le petit script ci dessous devrait te renommer tes 418 fichiers.
Il faut bien sur 418 lignes dans excel avec les nouveaux noms dans la colonne "A"
Il faut dans le dossier des scripts , 418 scripts , "script1 , script2 , script3 , ......script418"

pour utiliser ce script:
Ouvrir l’application “Editeur de script” qui est dans Application—>Utilitaires
Choisir le bouton en bas à gauche “Nouveau document”, dans la fenêtre qui s’ouvre faire un copier-coller du script.
Cliquer sur le bouton "triangle play" en haut à droite “Exécuter”

Le script à été fait en vitesse sans aucune vérification d'erreur, mais il ne doit servir qu'une seule fois !

Au lancement il te demande de choisir le fichier excel contenant la liste des nouveaux noms en colonne "A"
puis il te demande de choisir le dossier contenant tes 418 scripts...
Il te prévient lorsqu'il a terminé.

Bloc de code:
tell application "Finder"
    set lefichier to choose file with prompt "Sélectionner le fichier excel"
    set nom to lefichier as string
    set lesscripts to choose folder with prompt "Sélectionner le dossier des scripts"
end tell

tell application "Microsoft Excel"
    open nom -- ouvre le fichier
 
    repeat with i from 1 to 418
        set lacasenom to "A" & i
        set lavaleur1 to value of range lacasenom --cellule à copier
     
        set lesscripts to lesscripts as string -- chemin au format string
        set lescript to lesscripts & "script" & i & ".scpt" --nom complet du fichier a renommer
     
        set lescript to lescript as alias -- chemin du fichier a renommer
        tell application "Finder"
            set name of lescript to lavaleur1 & ".scpt" --renomme
        end tell
     
    end repeat
end tell


tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell

Merci ! Cela fonctionne parfaitement !
J'ai donc une dernière question :

Chaque script contient l'AppleScript suivant :
AppleScript:
set fuseauSelectionne to {""}

on obtenirHeure(fuseau)
    set laDate to current date
    set timeFormat to quoted form of "%H:%M:%S"
    set heure to (do shell script "TZ='" & fuseau & "' date +" & timeFormat)
    return heure
end obtenirHeure

try
    do shell script "sudo systemsetup -settimezone " & fuseauSelectionne with administrator privileges
    display dialog "Le fuseau horaire a été défini comme celui du système." buttons {"Fermer"} default button 1 with title "Fuseau horaire mis à jour"
on error errMsg number errNum
    display dialog "Une erreur s'est produite :" & return & errMsg & return & "Numéro d'erreur : " & errNum & "
        
Tentez d'éxecuter à nouveau l'opération depuis Fuseaux." buttons {"Fermer"} default button 1 with title "Échec" with icon caution
end try

Est-il possible de compléter l'espace {""} de chaque script par le nom même de celui-ci ?
 
Bonsoir,
Si j'ai bien compris,
Tous le fichiers ont exactement le même contenu, et tu veux que la première ligne devienne:
Bloc de code:
set fuseauSelectionne to {"nom_fichier.scpt"}
si c'est bien ça alors essai ce script.

Attention vu qu'il modifie les fichiers originaux, fait le job sur une copie ! :)

au lancement le script te demande de sélectionner le dossier contenant les scripts à modifier
Bon tests !
Bloc de code:
tell application "Finder"
    set source to choose folder with prompt "Sélectionner le dossier contenant les 148 fichiers scpt"
   
    set lesfichiers to files of source
    repeat with chaque_fichier in lesfichiers
        set nom to name of chaque_fichier
       
        set chemindef to source & nom as text --((path to desktop folder as text) & nom) as text
       
        set guil to ASCII character 34
        set laligne to "set fuseauSelectionne to {" & guil & nom & guil & "}"
        set letexte1 to "on obtenirHeure(fuseau)" & return & "set laDate to current date" & return & "set timeFormat to quoted form of " & guil & "%H:%M:%S" & guil & return & "set heure to (do shell script " & guil & "TZ='" & guil & " & fuseau & " & guil & "' date +" & guil & " & timeFormat)" & return & "return heure" & return & "end obtenirHeure" & return & return
        set letexte2 to "try" & return & "do shell script " & guil & "sudo systemsetup -settimezone " & guil & " & fuseauSelectionne with administrator privileges" & return & "display dialog " & guil & "Le fuseau horaire a été défini comme celui du système." & guil & " buttons {" & guil & "Fermer" & guil & "} default button 1 with title " & guil & "Fuseau horaire mis à jour" & guil & return & "on error errMsg number errNum" & return & "display dialog " & guil & "Une erreur s'est produite :" & guil & " & return & errMsg & return & " & guil & "Numéro d'erreur : " & guil & " & errNum & " & guil & return & return & "Tentez d'éxecuter à nouveau l'opération depuis Fuseaux." & guil & " buttons {" & guil & "Fermer" & guil & "} default button 1 with title " & guil & "Échec" & guil & " with icon caution" & return & "end try"
       
        set lefichier to open for access chemindef with write permission
        set eof lefichier to 0
        write laligne & return & letexte1 & return & letexte2 to lefichier starting at eof
       
        close access lefichier
    end repeat
end tell

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
Je découvre le sujet et je dois dire qu'un export du fichier en csv et un petit ksh et le tour était joué. Le shell c'est un des outils les plus puissant que je connaisse ! :p

Jamais eu le temps de me mettre à l'AppleScript, mais bon quand on bosse en multi-unix on prend ce qui est commun.
 
Bonsoir,
Si j'ai bien compris,
Tous le fichiers ont exactement le même contenu, et tu veux que la première ligne devienne:
Bloc de code:
set fuseauSelectionne to {"nom_fichier.scpt"}
si c'est bien ça alors essai ce script.

Attention vu qu'il modifie les fichiers originaux, fait le job sur une copie ! :)

au lancement le script te demande de sélectionner le dossier contenant les scripts à modifier
Bon tests !
Bloc de code:
tell application "Finder"
    set source to choose folder with prompt "Sélectionner le dossier contenant les 148 fichiers scpt"
  
    set lesfichiers to files of source
    repeat with chaque_fichier in lesfichiers
        set nom to name of chaque_fichier
      
        set chemindef to source & nom as text --((path to desktop folder as text) & nom) as text
      
        set guil to ASCII character 34
        set laligne to "set fuseauSelectionne to {" & guil & nom & guil & "}"
        set letexte1 to "on obtenirHeure(fuseau)" & return & "set laDate to current date" & return & "set timeFormat to quoted form of " & guil & "%H:%M:%S" & guil & return & "set heure to (do shell script " & guil & "TZ='" & guil & " & fuseau & " & guil & "' date +" & guil & " & timeFormat)" & return & "return heure" & return & "end obtenirHeure" & return & return
        set letexte2 to "try" & return & "do shell script " & guil & "sudo systemsetup -settimezone " & guil & " & fuseauSelectionne with administrator privileges" & return & "display dialog " & guil & "Le fuseau horaire a été défini comme celui du système." & guil & " buttons {" & guil & "Fermer" & guil & "} default button 1 with title " & guil & "Fuseau horaire mis à jour" & guil & return & "on error errMsg number errNum" & return & "display dialog " & guil & "Une erreur s'est produite :" & guil & " & return & errMsg & return & " & guil & "Numéro d'erreur : " & guil & " & errNum & " & guil & return & return & "Tentez d'éxecuter à nouveau l'opération depuis Fuseaux." & guil & " buttons {" & guil & "Fermer" & guil & "} default button 1 with title " & guil & "Échec" & guil & " with icon caution" & return & "end try"
      
        set lefichier to open for access chemindef with write permission
        set eof lefichier to 0
        write laligne & return & letexte1 & return & letexte2 to lefichier starting at eof
      
        close access lefichier
    end repeat
end tell

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
Merci de ta réponse ! :)
Cela fonctionne parfaitement, mais est-il possible de retirer ".scpt" au nom de chaque fuseau ? (car le but des scripts est de définir un fuseau donc problème si l'extension de fichier est toujours dans le nom)
 
Bonsoir,
Voilà le script modifié pour mettre le nom sans l'extension.
Dis moi si c'est bon !

Bloc de code:
tell application "Finder"
    set source to choose folder with prompt "Sélectionner le dossier contenant les 148 fichiers scpt"
    
    set lesfichiers to files of source
    repeat with chaque_fichier in lesfichiers
        set nom to name of chaque_fichier
        set nomcourt to text 1 thru ((offset of "." in nom) - 1) of nom
        
        set chemindef to source & nom as text --((path to desktop folder as text) & nom) as text
        
        set guil to ASCII character 34
        set laligne to "set fuseauSelectionne to {" & guil & nomcourt & guil & "}"
        set letexte1 to "on obtenirHeure(fuseau)" & return & "set laDate to current date" & return & "set timeFormat to quoted form of " & guil & "%H:%M:%S" & guil & return & "set heure to (do shell script " & guil & "TZ='" & guil & " & fuseau & " & guil & "' date +" & guil & " & timeFormat)" & return & "return heure" & return & "end obtenirHeure" & return & return
        set letexte2 to "try" & return & "do shell script " & guil & "sudo systemsetup -settimezone " & guil & " & fuseauSelectionne with administrator privileges" & return & "display dialog " & guil & "Le fuseau horaire a été défini comme celui du système." & guil & " buttons {" & guil & "Fermer" & guil & "} default button 1 with title " & guil & "Fuseau horaire mis à jour" & guil & return & "on error errMsg number errNum" & return & "display dialog " & guil & "Une erreur s'est produite :" & guil & " & return & errMsg & return & " & guil & "Numéro d'erreur : " & guil & " & errNum & " & guil & return & return & "Tentez d'éxecuter à nouveau l'opération depuis Fuseaux." & guil & " buttons {" & guil & "Fermer" & guil & "} default button 1 with title " & guil & "Échec" & guil & " with icon caution" & return & "end try"
        
        set lefichier to open for access chemindef with write permission
        set eof lefichier to 0
        write laligne & return & letexte1 & return & letexte2 to lefichier starting at eof
        
        close access lefichier
    end repeat
end tell

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
  • J’aime
Réactions: #iTech
OK !
content pour toi !
;)
 
  • J’adore
Réactions: #iTech
Si les fichiers sont vides, il est aussi possible de créer directement ces fichiers vides avec la commande touch.
Tu te places dans le dossier qui te va bien depuis le terminal et ensuite tu tapes/copies colles :

Bloc de code:
touch Script1.scpt Script2.scpt Script3.scpt
avec une espace entre chaque nom de fichier
 

@#iTech

J'ai oublier de te préciser que la récupération du nom sans extension telle que je l'ai écrit ne fonctionne que si il n'y a pas de point"." dans le nom ! sinon il faut utiliser le script ci-dessous.
Désolé si cela t'a provoqué des problèmes !

Bloc de code:
tell application "Finder"
    set source to choose folder with prompt "Sélectionner le dossier contenant les fichiers scpt"
    
    set lesfichiers to files of source
    repeat with chaque_fichier in lesfichiers
        set nom to name of chaque_fichier
        
        set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
        set AppleScript's text item delimiters to {"."} --récupère la partie avant le dernier "."
        set elements to text items of nom
        set nomcourt to (items 1 thru -2 of elements) as string
        set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
        
        set chemindef to source & nom as text --((path to desktop folder as text) & nom) as text
        
        set guil to ASCII character 34
        set laligne to "set fuseauSelectionne to {" & guil & nomcourt & guil & "}"
        set letexte1 to "on obtenirHeure(fuseau)" & return & "set laDate to current date" & return & "set timeFormat to quoted form of " & guil & "%H:%M:%S" & guil & return & "set heure to (do shell script " & guil & "TZ='" & guil & " & fuseau & " & guil & "' date +" & guil & " & timeFormat)" & return & "return heure" & return & "end obtenirHeure" & return & return
        set letexte2 to "try" & return & "do shell script " & guil & "sudo systemsetup -settimezone " & guil & " & fuseauSelectionne with administrator privileges" & return & "display dialog " & guil & "Le fuseau horaire a été défini comme celui du système." & guil & " buttons {" & guil & "Fermer" & guil & "} default button 1 with title " & guil & "Fuseau horaire mis à jour" & guil & return & "on error errMsg number errNum" & return & "display dialog " & guil & "Une erreur s'est produite :" & guil & " & return & errMsg & return & " & guil & "Numéro d'erreur : " & guil & " & errNum & " & guil & return & return & "Tentez d'éxecuter à nouveau l'opération depuis Fuseaux." & guil & " buttons {" & guil & "Fermer" & guil & "} default button 1 with title " & guil & "Échec" & guil & " with icon caution" & return & "end try"
        
        set lefichier to open for access chemindef with write permission
        set eof lefichier to 0
        write laligne & return & letexte1 & return & letexte2 to lefichier starting at eof
        
        close access lefichier
    end repeat
end tell

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
  • J’aime
Réactions: #iTech