Jump to content
Just nu i M3-nätverket

"Skapa nytt jobb" med automator


Davegunnardo

Recommended Posts

Hej

Jag är egenföretagare och har plötsligt hamnat i sittsen att jag inte kan hålla mycket eller ens lite i huvudet. Jag behöver få in mer och mer i datorn FORT, vilket jag tänkte att automator kanske kan hjälpa mig med.

 

Vad jag behöver är ganska enkelt, men jag har inte lyckats!

 

Skriptet ska skapa en mapp i min bokningsmapp. Den ska sedan fråga mig efter ett namn på bokningen, samt datum. Sedan ska den gå in i en fil och hämta ett bokningsnummer (och när den är klar sparar den om filen fast har gjort "+1" till numret så att nästa bokning får ett nytt nummer). Detta ska leda till att en mapp skapas som heter t ex "071103 D8888 Bokningsnamn".

 

Jag hittar inte funktionen att den kan hämta info från en textfil. Jag hittar inte heller hur man kan överföra flera variabler till namnet på den nya mappen..

 

Finns det ngn kunnig som har tid och lust att hjälpa mig? .... Ska jag kanske använda mig av apple-script istället?

 

Behöver sen lite funktioner som att lägga till bokningsnummer, datum etc i pagesdokumenten osv. Men det är en senare fråga...

Link to comment
Share on other sites

Jag kan inte ett jota om Automator, men att AppleScript klarar detta galant är jag säker på.

 

okay, det är ju jättebra. Jag kan inte tt jota om AppleScript.. har programmerat JavaScript och lite allt möjligt enkelt tidigare, men att göra ett applescript från scratch kan jag inte..

 

Någon som har för mkt fritid till förfogande här som kan ge mig ngt att utgå från? :propellerbaver:

Link to comment
Share on other sites

okay, det är ju jättebra. Jag kan inte tt jota om AppleScript.. har programmerat JavaScript och lite allt möjligt enkelt tidigare, men att göra ett applescript från scratch kan jag inte..

 

Någon som har för mkt fritid till förfogande här som kan ge mig ngt att utgå från? :propellerbaver:

 

Om det bara hängde på fritiden...he he...jag har en C-uppsats att skriva, men viljan är å andra sidan god!

 

Vad du behöver först är en skriptbar texteditor. De jag kommer på direkt är "TextWrangler" och "Smultron". Om du laddar hem TextWrangler så är det en fördel åtminstone om det blir jag som hjälper dig vidare med detta, eftersom jag är rätt van vid att programmera AppleScript för åtminstone mina behov av textbehandling tillsammans med just TextWrangler.

 

Om du alltså vill gå vidare med AS och TextWrangler så ska jag försöka hjälpa dig. I stora drag har jag lösningen klar för mig, även om jag kanske inte bör säga allt för mycket innan den är testad. Till att börja med: är bokningsdatum alltid dagens datum eller kan det variera? Numret som ska ingå i mappens namn samt uppdateras rullande, är detta ett 'rent nummer' eller består det också av någon bokstav som i ditt exempel? Hur vill du ha mappen placerad - på skrivbordet eller i någon mappstruktur (hur ser i så fall den ut?)?

Link to comment
Share on other sites

Just det ja...om numret innehåller bokstavskod som i exemplet, behöver även bokstavskoden ändras någon gång?

 

Eftersom du kan Java-script så tror jag f ö att det här blir en rätt lätt affär. Så vitt jag förstår är JS svårare än AS (eller också beror intrycket på att jag inte alls kan JS). Det senare är lite knepigt mest för att olika applikationer har sina respektive syntaxer; dvs, även fast det finns en grundsyntax för AS så varierar den i det lilla.

 

En första 'sniff' av AS i relation till uppgiften för att ge dig en ide om hur AS-syntaxen ser ut:

 

tell app "Finder"

activate

 

display dialog "Bokningsnamn?" default answer "" buttons (" Cancel ", "OK") default button "OK" with icon note

 

set myResult1 to the result

 

if the button returned of myResult1 = " Cancel " then

 

error number -128 -- står för "användaren avbröt"

 

end if

 

set bokning to the text returned of myResult as string -- variabel som tar upp bokningsnamnet

 

end tell

Link to comment
Share on other sites

set bokning to the text returned of myResult as string -- variabel som tar upp bokningsnamnet

end tell

 

Tsk, tsk...okoncentrerad. Det skulle förstås vara: set bokning to the text returned of myResult1 as string

Link to comment
Share on other sites

Tsk, tsk...okoncentrerad. Det skulle förstås vara: set bokning to the text returned of myResult1 as string

 

Shysst!!

 

Har inte OSX en inbyggd Applescript-redigareare där man även kan "provköra" scripten? Annars kan jag givetvis ladda hem textwrangler om det underlättar..

 

 

Datumet ska inte genereras utan fyllas i av mig.

Numret som genereras har bokstaven "D" framför sig men den bokstaven ändras aldrig. Däremot måste numret stegas upp för varje ny bokning.

 

Mappen som skapas ska läggas i en mapp (dokument/bokningar/).

Till mappen ska sedan tre filer kopieras, filer som ligger i (dokument/bokningar/Nytt jobb).

Dessa ska sedan bytas namn på så att de inleds med bokningsnr (exempel: D**** Plocklista).

 

Avancerat :P

Link to comment
Share on other sites

Shysst!!

 

Har inte OSX en inbyggd Applescript-redigareare där man även kan "provköra" scripten? Annars kan jag givetvis ladda hem textwrangler om det underlättar.. (...)

 

Jo, det stämmer: i "Program" hittar du AppleScript's Manusredigerare. Det är enklast att spara filerna som "Manus" medan man skriver och testar AppleScript. Färdiga applikationer fungerar vanligen bäst sparade som "Programpaket". Men "TextWrangler" eller annan skriptbar texteditor behöver du ändå. Dokumentet som förvarar bokningskoden måste vara av den skriptbara typ som reagerar på 'tilltal' från AppleScript.

 

Så var då frågan om hur gå vidare? Eftersom du kan JS förmodar jag att du kan lösa uppgiften själv när du fått en klar ide om hur AS fungerar? Samtidigt har jag ett kod-förslag som jag väljer att publicera här. Jag tänker att vill du göra jobbet själv så har du ju fortfarande möjlighet att göra det - samtidigt får du genom koden förmodligen alla uppgifter du behöver om AS-syntax för den här typen av skript.

 

Nedanstående kod är efter dina anvisningar och förutsätter att du håller dig till "D" som enda bokstav och kodprefix (koden är å andra sidan lätt att ändra på den punkten om du byter bokningssystem). Kodningen förutsätter "TextWrangler" som texteditor - men andra skriptbara texteditorer går bra att använda. Skillnaden blir då att namnet på editorn måste skrivas in i kodens subrutin där nu "TextWrangler" står, tillsammans med risken att viss syntax i övrigt kan behöva ändras.

 

I koden utgår jag från att mappen "Bokningar" ligger i mappen "Dokument" och att "Dokument" är översta mapp på hårddisken. I mappen "Dokument" förutsätts i min kodning ligger en mapp vid namn "Bokningsnummer" innehållande ett 'TextWrangler-dokument' med bokningskoden på översta raden. Om inte detta skulle stämma, eller du vill ha det annorlunda, kan du förstås lätt ändra detta i koden.

 

Du kan väl testa i Manusredigeraren och se vad du tycker? Jag lade på slutet in en dialog som berättar om slutresultatet samt möjlighet att vid t ex felinslagna uppgifter radera den nyskapade mappen (bekvämare än att söka sig in i mappstrukturen manuellt, föreställer jag mig). Möjligen har du genom mitt exempel fått tillräckligt med AS-kod för att veta hur du skriver resten av koden för de tre filerna som ska flyttas den nygjorda mappen? Återkom annars bara. Det är ju f ö fullt tänkbart att du stöter på problem redan med denna kod när den byter miljö till din dator (koden är i alla fall testad och fungerar i min burk). Vi får väl se vad som återstår att brottas med av problem. :ThumbsUp:

 

 

with timeout of 300 seconds

tell application "Finder"

activate

 

display dialog "Bokningsnamn?" default answer "" buttons {" Cancel ", "OK"} default button "OK" with icon note

 

set myResult1 to the result

 

if the button returned of myResult1 = " Cancel " then

 

error number -128

 

end if

 

set bokning to the text returned of myResult1 as string

 

display dialog "Datum?" default answer "" buttons {" Cancel ", "OK"} default button "OK" with icon note

 

set myResult2 to the result

 

if the button returned of myResult2 = " Cancel " then

 

error number -128

 

end if

 

set datum to the text returned of myResult2 as string

 

open document file 1 of folder "Bokningsnummer" of folder "DokumentTest" of startup disk -- målmappen skrivs före övre liggande mappar

 

delay 3 -- ger tid åt dokumentet med bokningskoden att öppna

 

my catchAndWorkText() -- subrutin som anropar vad som i detta kodexempel är applikationen "TextWrangler" - för att kopiera bokningsnumret ur dokumentet samt ändra numret + 1.

 

set dokumentNumberCode to the result as string -- variabel som tar emot bokningsnumret returnerat från subrutinen

 

set folderNameString to datum & space & dokumentNumberCode & space & bokning as string -- sammanfogning av variablerna med värderna från dialogen, med variabeln med bokningsnumret för att bilda den textsträng som namnger den nya mapp som ska skapas

 

set this_folder to folder "Bokningar" of folder "Dokument" of startup disk -- i variabeln "this_folder" anges 'adress' för skapande av ny mapp

 

make new folder at this_folder with properties {name:folderNameString} -- kommandot skapar ny mapp med rätt namn och i rätt mapp

 

end tell

 

tell application "Finder"

activate

 

display dialog "Följande mapp har skapats i bokningsmappen: " & "'" & folderNameString & "'" buttons {"Radera", "OK"} default button "OK" with icon note

 

set myResult3 to the result

 

if the button returned of myResult3 = "Radera" then

 

set z to folder folderNameString of folder "Bokningar" of folder "Dokument" of startup disk

 

delete z

 

empty trash

 

end if

 

end tell

end timeout

 

on catchAndWorkText() -- subrutin för att hämta bokningsnummer samt ändra detta rullande + 1

 

tell application "TextWrangler"

activate

 

set newVersal to "D" as string

 

set tx to the text of document 1 as string -- tar upp bokningskoden; detta värde returnerar subrutinen för skapande av ny mapp i vars namn bokningskoden ingår

 

set nbC to the number of characters in tx as integer -- räknar samtliga tecken i bokningskoden

 

set txTemp to characters 2 thru nbC of tx as string -- kopierar över de av tecknen som är siffrorna efter "D" till egen variabel

 

set txInt to txTemp as integer -- siffersträngen med bokningsnumret görs till räknebara siffror

 

set txInt to txInt + 1 -- bokningsnumret höjs med värde 1

 

set newNumberString to txInt as string -- det höjda bokningsnumret görs till textsträng

 

set newBokningsCodeString to newVersal & newNumberString as string -- det höjda bokningsnumret förenas med prefixet "D"

 

select word 1 of line 1 of front document

 

delete selection -- gamla bokningsnumret raderas

 

select insertion point before line 1 of front document

 

set selection to contents of newBokningsCodeString -- nya bokningsnumret placeras i dokumentet

 

close document 1 saving yes

 

return tx -- returnerar bokningskoden som den var före ändring att placeras i namnet på mappen som skapas

 

end tell

end catchAndWorkText

Link to comment
Share on other sites

En sak som slog mig: om den skapade mappen ev. behöver raderas, så behöver väl också bokningsnumret rullas tillbaka med -1? Detta går att åtadkomma genom att följa samma kodprinciper som i koden ovan - dvs, en likadan typ av subrutin med skillnaden att den räknar -1 istället för +1, tillsammans med några rader i koden för dialog nr 3 som aktiverar justeringen av bokningsnumret ifall knappen "Radera" används.

 

Men okay, ska förstås först höra vad du tycker om ovanstående kod.

Link to comment
Share on other sites

open document file 1 of folder "Bokningsnummer" of folder "DokumentTest" of startup disk -- målmappen skrivs före övre liggande mappar

 

Korrigering: i ovanstående kodrad, som ligger strax efter koden följande på dialog nr 2, råkade jag lämna kvar namnet på testmappen som jag använde när jag prövade skriptet. Koden behöver ändras till: "...of folder "Dokument" of startup disk"

Link to comment
Share on other sites

Här går det undan! Jag insåg att det var lika bra att jag direkt klarade av bristerna som satt och kliade så störande i bakhuvudet på mig (omöjligt att försöka studera och lösa skriptproblem samtidigt, märkte jag).

 

Jag kom på att eftersom den här funktionen ska fungera likt ett kommersiellt program, så är det nog ingen vits med att programmet stänger av efter en enda användning? I "2.0-versionen" av koden fortsätter programmet och visar inslagsdialoger tills användaren avslutar. Jag har även implementerat den ovan nämnda 'backande numreringen' vid radering av felinslagen mapp. Nuuu...blir det inga fler tillägg förrän du har tittat på koden. :whistling:

 

 

with timeout of 36000 seconds -- skriptet kan gå i 10 timmar utan avbrott; öka vid behov

tell application "Finder"

activate

 

set repInd to "0" as string

 

repeat until repInd = "1"

 

my mainRoutine()

 

set runInd to the result as string

 

copy runInd to repInd

 

end repeat

 

end tell

end timeout

 

-- quit

 

(* ta bort kommentarsstrecken framför "quit" vid 'skarp' körning, dvs om denna kod kommer att användas som program i en fil sparad som 'programpaket'. Kommandot försäkrar om att skriptet stänger av så att det inte ligger och tar upp minne i onödan efter att användaren har avslutat *)

 

on mainRoutine() -- mycket av den tidigare koden stoppade jag i en huvud-subrutin som är placerad i den ovanstående repetitionsslingan

 

tell application "Finder"

 

set runIndicator to "0" as string

 

display dialog "Bokningsnamn?" default answer "" buttons {" Cancel ", "OK"} default button "OK" with icon note

 

set myResult1 to the result

 

if the button returned of myResult1 = " Cancel " then

 

error number -128

 

end if

 

set bokning to the text returned of myResult1 as string

 

display dialog "Datum?" default answer "" buttons {" Cancel ", "OK"} default button "OK" with icon note

 

set myResult2 to the result

 

if the button returned of myResult2 = " Cancel " then

 

error number -128

 

end if

 

set datum to the text returned of myResult2 as string

 

open document file 1 of folder "Bokningsnummer" of folder "Dokument" of startup disk

 

delay 3

 

my catchAndWorkText()

 

set dokumentNumberCode to the result as string

 

set folderNameString to datum & space & dokumentNumberCode & space & bokning as string -- sammanfogning av variablerna med värderna från dialogen samt bokningsnumret för att bilda den textsträng som ska namnge den nya mapp som skapas

 

set this_folder to folder "Bokningar" of folder "Dokument" of startup disk -- anger 'adress' i variabeln "this_folder" för skapande av ny mapp

 

make new folder at this_folder with properties {name:folderNameString} -- kommandot som skapar den nya mappen med avsettt namn och på avsedd adress

 

end tell

 

tell application "Finder"

activate

 

display dialog "Följande mapp har skapats i bokningsmappen: " & "'" & folderNameString & "'" buttons {"Avsluta skriptet", "Radera", "OK"} default button "OK" with icon note

 

set myResult3 to the result

 

if the button returned of myResult3 = "Radera" then

 

open document file 1 of folder "Bokningsnummer" of folder "Dokument" of startup disk

 

delay 3 -- ger tid åt dokumentet att öppna

 

my catchAndWorkText2() -- subrutin som återställer bokningsnumret ur dokumentet med - 1.

 

set z to folder folderNameString of folder "Bokningar" of folder "Dokument" of startup disk

 

delete z

 

empty trash

 

delay 1

 

end if

 

if the button returned of myResult3 = "Avsluta skriptet" then

 

copy "1" to runIndicator

 

end if

 

end tell

 

tell application "Finder"

activate

 

return runIndicator

 

end tell

end mainRoutine

 

on catchAndWorkText() -- subrutin för att hämta bokningsnummer samt ändra detta rullande + 1

 

tell application "TextWrangler"

activate

 

set newVersal to "D" as string

 

set tx to the text of document 1 as string -- variabeln tx tar upp bokningskoden ur det öppna textdokumentet

 

set nbC to the number of characters in tx as integer -- denna kod räknar samtliga tecken i bokningskoden

 

set txTemp to characters 2 thru nbC of tx as string -- denna kod kopierar över de av tecknen som är siffrorna efter "D" till egen variabel

 

set txInt to txTemp as integer -- siffersträngen med bokningsnumret görs till räknebara siffror

 

set txInt to txInt + 1 -- bokningsnumret höjs med värde +1

 

set newNumberString to txInt as string -- det höjda bokningsnumret görs till textsträng

 

set newBokningsCodeString to newVersal & newNumberString as string -- det höjda bokningsnumret förenas med prefixet "D" i textsträng

 

select word 1 of line 1 of front document

 

delete selection -- gamla bokningsnumret raderas

 

select insertion point before line 1 of front document

 

set selection to contents of newBokningsCodeString -- nya bokningsnumret placeras i dokumentet

 

close document 1 saving yes -- textdokumentet spars och stängs

 

return tx -- retur från subrutinen av bokningskoden som den var före ändring

 

end tell

end catchAndWorkText

 

on catchAndWorkText2() -- subrutin som vid radering av nyskapad mapp ändrar bokningsnumret med - 1

 

tell application "TextWrangler"

activate

 

set newVersal to "D" as string

 

set tx to the text of document 1 as string

 

set nbC to the number of characters in tx as integer

 

set txTemp to characters 2 thru nbC of tx as string

 

set txInt to txTemp as integer

 

set txInt to txInt - 1

 

set newNumberString to txInt as string

 

set newBokningsCodeString to newVersal & newNumberString as string

 

select word 1 of line 1 of front document

 

delete selection

 

select insertion point before line 1 of front document

 

set selection to contents of newBokningsCodeString

 

close document 1 saving yes

 

end tell

end catchAndWorkText2

Link to comment
Share on other sites

du är inte klok! tusen tack!

 

ska testa detta direkt.

 

jätte-tack så länge! återkommer när jag kört fast ;)

Link to comment
Share on other sites

Det funkar ju hur bra som helst!

Vad jag funderar på är några kommandon jag behöver:

 

- Hur kopierar man filer? (Från dokument/Bokningsdokument/, dokumenten 001, 002 och 003).

 

- Kan man leta upp en känd bit text i ett dokument och ersätta denna? Exvis i ett numbers-dokument, leta upp texten "XXXXX" och ersätt med "dokumentNumberCode"? Obs ej i namnet utan i själva dokumentet.

Link to comment
Share on other sites

Det funkar ju hur bra som helst!

Vad jag funderar på är några kommandon jag behöver:

 

- Hur kopierar man filer? (Från dokument/Bokningsdokument/, dokumenten 001, 002 och 003).

 

- Kan man leta upp en känd bit text i ett dokument och ersätta denna? Exvis i ett numbers-dokument, leta upp texten "XXXXX" och ersätt med "dokumentNumberCode"? Obs ej i namnet utan i själva dokumentet.

 

Vad bra att det fungerar direkt hos dig! :ThumbsUp:

 

Kommandot för filkopiering i AS är "duplicate". T ex:

 

tell app "Finder"

activate

 

set selected_files to the document files of folder "Bokningsdokument" of folder "Dokument" of startup disk

 

duplicate selected_files

 

end tell

 

Denna tillämpning av kopiering/duplicate skapar duplikatfiler i samma mapp som originalfilerna. Behöver du flytta kopiorna till en annan mapp är åtminstone fördelen att duplikaten slutar med ändelsen "(kopia)" vilket gör dem lätta att identifiera och adressera i AS-kod. Vill du hellre kopiera via klippbordet för inkopiering i annan mapp, så kan man initiera tangenbordskommandona Kommando+C & Kommmando+V genom AS-kod.

 

I praktiken: om filerna som ska flyttas är samtliga filer i en känd mapp är det alltså inga problem som koden ovan visar. Ligger de aktuella filerna bland flera andra filer gäller förstås att det finns någon form av återkommande karaktäristik hos filerna (helst i namnet, men kan även vara sådant som skapelsedatum) som gör dem fortlöpande identifierbara för skriptet. Om filnamnen alltid är desamma och som i ditt exempel, så är saken enkel eftersom det räcker med att namnge dem i skriptkoden.

 

Faktum är att följande kodning verkar fungera för att identifiera exempelfilerna i en mapp som även innehåller andra filer (varför det fungerar begriper jag inte eftersom denna kodning brukar fungera ihop med räknebara tal - vilket ju inte alls gäller när siffrorna står som namn - men likafullt):

 

set the_files to files "001" thru "003" of folder "Bokningsdokument" of folder "Dokument" of startup disk

 

Att leta upp en känd bit text i ett textdokument bör gå bra. Texten bör förstås vara urskiljbar på något vis framför annan text eller bestå av vissa kända lägen, som t ex ord nr si och så i en i förväg känd meningsrad nr si och så. Jag vet inte vad ett "numbers-dokument" är? Det väsentliga vid 'Apple-skriptning' är att dokumentet skapas av en skriptbar applikation så att det går att adressera med AppleScript genom anrop till applikationen - på det vis du har sett "TextWrangler" anropas i skriptkoden.

 

Återkom gärna med fler detaljer om du tycker att de här råden var för allmänna.

 

F ö: vill du finputsa går antagligen delay-funktionen att förbättra i min kod. När inte "TextWrangler" är aktivt tar det några sekunder på sig att öppna dokumenten. Ibland väntar skripet i sådana lägen men ibland väntar det inte tillräckligt länge; jag kastar därför slentrianmässigt in ett delay för dokumentöppnanden i sådana lägen. Men när "TextWrangler" väl är igång öppnas dokumenten så snabbt att något delay troligen inte behövs (eller max 0.5 sek). Det bör gå att t ex lägga in ett räkneverk i repetitionsslingan, skicka värdet till subrutinen, och sätta konditionella vllkor för delay så att det endast används vid första körningen av skriptet, eller används med t ex delay 0.5 sek vid senare körningar när "TextWrangler" är öppet. För den otålige...

Link to comment
Share on other sites

Jag vill också tipsa om Skriptmenyn också ifall du inte känner till den. Det är möjligt att aktivera Apple-skript via Finder. Man lägger skripten i mappen "Scripts" i användarbiblioteket (inte något av de andra biblioteken, observera). Man kan sedan starta skriptet från en program-meny som visas i form av en skriptsymbol uppe till höger i Finder-menyn (några steg till vänster om volymkontrollen i Tiger). Det enda är att jag minns inte hur menyn aktiveras (det var några år sedan för min del). Men det är enkelt - typ att kryss-markera en ruta någonstans i en Systeminställning, har jag för mig.

 

Jag kan även tipsa om programmet Fastscripts Lite (gratis) med vilket går att (det fixar förresten också en skriptmeny i Finder) att lägga till snabbkommandon från tangentbordet som aktiverar Apple-Script.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...