Samla in samma cell från återkommande inventeringstabeller genom att exportera varje tabell som CSV och sedan köra en Finder-genväg som läser den positionen och skapar en översikt. Den här genomgången samlar in B3, behåller varje källfilnamn och vägrar skriva över ett befintligt resultat.

Välj rätt indata innan du bygger genvägen

Det här arbetsflödet är avsett för den som underhåller flera inventeringstabeller med samma layout och vill ha en rad per tabell i en separat översikt. Exemplet använder tre tillfälliga filer med syntetiska antal. Varje fil motsvarar en exporterad tabell; målet är kolumn B, rad 3, inklusive rubrikraden.

Håll isär tre saker: kalkylbladsdokumentet, tabellen i det och den exporterade CSV-filen. Apples dokumentation för Numbers tillåter CSV-export antingen som separata filer för varje tabell eller med tabellerna sammanslagna. För den här uppgiften väljer du separata filer: om tabellerna slås samman kan målpostens position förändras. CSV-exporter innehåller cellvärden, så den resulterande översikten är en ögonblicksbild. Exportera till andra filformat i Numbers på Mac.

Genvägen nedan överlåter extraheringen till ett litet Python-program. Det behandlar inte ett Numbers-dokument eller en Excel-arbetsbok som vanlig text och utgår inte från att en åtgärd får åtkomst till cellerna bara för att den tar emot en kalkylbladsfil som indata. Apple beskriver hur du kan granska vilka indata en åtgärd accepterar och vilka utdata den ger via informationspanelen. Använd panelen när du kontrollerar vilka åtgärder som finns på din Mac. Navigera i åtgärdslistan i Genvägar på Mac.

Använd den här beslutstabellen innan du börjar:

Utgångsläge Förberedelser för det här arbetsflödet
En matchande tabell i varje Numbers-dokument Exportera varje tabell som CSV.
Flera matchande tabeller i ett dokument Exportera separata CSV-filer och identifiera de avsedda tabellerna.
Befintliga CSV-filer avgränsade med kommatecken Bekräfta kodning, layout och målposition.
Olika layouter eller inventeringsrader som flyttar sig Standardisera de tillfälliga exemplen först; en fast koordinat kan inte ensam identifiera rätt antal.

I exemplet måste varje källa ha Counted units i A3 och det önskade värdet i B3. Om du även kontrollerar den intilliggande etiketten får du ett användbart felsökningssteg: en förskjuten rad avbryter körningen i stället för att tyst samla in ett orelaterat värde. Det kan inte upptäcka alla möjliga layoutfel, så kontrollera båda cellerna när du förbereder indata.

Förbered tillfälliga inventeringsfiler

För det här exemplet behöver du installera Python 3 separat. Med standardinstallationsprogrammet från Pythons webbplats placeras körbara länkar i /usr/local/bin/. Kommandona nedan använder uttryckligen /usr/local/bin/python3 och är därför inte beroende av genvägens sökväg för kommandon. Följ installationsanvisningarna för den Python-version du använder och kontrollera sedan att kommandot fungerar. Använda Python på macOS.

/usr/local/bin/python3 --version

Om sökvägen saknas slutför du Python-installationen innan du fortsätter. Programmet använder enbart Pythons standardbibliotek; inga ytterligare paket behövs. Apples guide till Terminal förklarar att kommandon kan köras genom att ange den körbara filens fullständiga sökväg följd av dess argument. Köra kommandon och verktyg i Terminal på Mac.

Klistra in hela det här kommandot i Terminal för att skapa syntetiska indata. Det skapar Inventory Demo på skrivbordet och avbryts om mappen redan finns. Använd en ny tillfällig mapp i stället för att slå ihop exemplen med en befintlig katalog.

/usr/local/bin/python3 - <<'PY'
import csv
from pathlib import Path

root = Path.home() / "Desktop" / "Inventory Demo"
root.mkdir()
examples = [
    ("Birch", "A", "12"),
    ("Cedar", "B", "7"),
    ("Maple", "C", "0"),
]
for name, bin_name, count in examples:
    with (root / f"{name}.csv").open(
        "x", encoding="utf-8", newline=""
    ) as handle:
        csv.writer(handle).writerows([
            ["Item", "Value"],
            ["Bin", bin_name],
            ["Counted units", count],
        ])
print(root)
PY

Om du vill testa Numbers-exporten separat öppnar du en tillfällig CSV-fil i Numbers och exporterar den till en annan tillfällig mapp via Arkiv > Exportera till > CSV. Välj en fil för varje tabell, låt Inkludera tabellnamn vara avstängt och använd UTF-8-kodning. Granska den exporterade tabellen för att bekräfta att A3 och B3 fortfarande innehåller den avsedda etiketten och värdet. Apple dokumenterar de här exportalternativen. Exportinställningar i Numbers.

Byt inte bara tillägget för ett kalkylblad till .csv som ersättning för att exportera det. Programmet förväntar sig faktisk text avgränsad med kommatecken. Behåll de tre ursprungliga syntetiska CSV-filerna tillsammans för den fortsatta genomgången.

Skapa programmet som bygger översikten

Spara följande fullständiga program som overview.py i Inventory Demo med en vanlig textredigerare. Kontrollera att filnamnet slutar på .py och inte .py.txt. Programmet tar emot sökvägar till källfiler som argument, läser B3 och skapar overview.csv i deras gemensamma mapp.

import csv
import io
import sys
from pathlib import Path

ROW, COLUMN = 2, 1  # Zero-based: B3
LABEL = "Counted units"

def build_overview(arguments):
    if not arguments:
        raise ValueError("Select at least one source CSV.")
    paths = [Path(name).expanduser().resolve(strict=True)
             for name in arguments]
    if len(set(paths)) != len(paths):
        raise ValueError("The same source was supplied twice.")
    if len({path.parent for path in paths}) != 1:
        raise ValueError("Keep all source CSVs in one folder.")
    rows = []
    for path in sorted(paths, key=lambda p: p.name):
        if (not path.is_file() or path.suffix.lower() != ".csv"
                or path.name.casefold() == "overview.csv"):
            raise ValueError(f"Not a source CSV: {path.name}")
        with path.open(encoding="utf-8-sig", newline="") as handle:
            records = list(csv.reader(handle, strict=True))
        if len(records) <= ROW or len(records[ROW]) <= COLUMN:
            raise ValueError(f"{path.name}: B3 does not exist.")
        if records[ROW][0] != LABEL:
            raise ValueError(f"{path.name}: A3 must be {LABEL!r}.")
        value = records[ROW][COLUMN]
        status = "blank" if value.strip() == "" else "present"
        rows.append([path.name, "B3", value, status])
    buffer = io.StringIO(newline="")
    writer = csv.writer(buffer)
    writer.writerow(["Source file", "Cell", "Value", "Status"])
    writer.writerows(rows)
    return paths[0].parent / "overview.csv", buffer.getvalue()

def main(arguments):
    try:
        destination, content = build_overview(arguments)
        with destination.open("x", encoding="utf-8", newline="") as handle:
            handle.write(content)
    except (OSError, ValueError, csv.Error) as error:
        print(f"Stopped: {error}", file=sys.stderr)
        return 1
    print(f"Created: {destination}")
    return 0

if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))

Programmet använder en CSV-tolk i stället för att dela upp text vid kommatecken eller radbrytningar. Pythons läsarfunktion returnerar fält som strängar och dokumentationen anger att CSV-filer ska öppnas med newline="". Det hanterar citerade fält som innehåller kommatecken eller inbäddade radbrytningar. Programmet bevarar det extraherade värdet utan att summera det eller omvandla det till ett tal. Läsa och skriva CSV-filer.

Flera avsiktliga begränsningar gör resultatet enklare att kontrollera. Alla indata måste finnas, alla lösta källsökvägar måste tillhöra samma mapp och dubblerade lösta sökvägar avvisas. Programmet sorterar efter filnamn i stället för att förlita sig på Finder-ordningen. Det avvisar också en indatafil med namnet overview.csv, vilket förhindrar att det föregående resultatet inkluderas av misstag.

Alla källor läses in och kontrolleras innan utdata skapas. Om B3 saknas eller om etiketten i A3 inte är den förväntade avbryts körningen. En befintlig men tom B3 ger en rad märkt blank; ett värde på 0 förblir 0 och märks present. Därmed får en saknad cell, en tom cell och ett nollvärde olika utfall.

Utdata skapas i exklusivt läge, "x". Python-dokumentationen anger att det här läget misslyckas om målet redan finns. Programmet ersätter därför varken den föregående översikten eller skapar ett filnamn med ett löpnummer. Ett fel under själva skrivningen kan fortfarande lämna en ofullständig ny fil; granska eventuella filer som blir kvar efter ett skrivfel innan du försöker igen. Pythons lägen för filöppning.

Koppla programmet till en Finder-genväg

Skapa en genväg som heter Inventory Overview i Genvägar. Öppna Detaljer, aktivera Använd som snabbåtgärd och välj Finder. Låt Filer vara aktiverat i indatakonfigurationen och stäng av orelaterade innehållstyper. Apple dokumenterar att genvägar som tar emot filer eller mappar kan användas i Finder, samt hur du begränsar vilka indata som godtas. Köra en genväg medan du arbetar på Mac, Begränsa indata till en genväg.

Ange Stoppa och svara som beteende när indata saknas, med ett meddelande som Välj CSV-källfilerna i Finder. Då leder inte ett tomt urval till en tvetydig körning. Alternativet och svarsfältet beskrivs i Apples guide till indatakonfiguration. Välja vad som ska hända om indata saknas.

Lägg till Kör skalskript. Ange /bin/zsh som Skal, koppla Indata till Genvägsindata och ange Skicka indata till som argument. Ersätt exempelskriptet med följande fullständiga kommando:

/usr/local/bin/python3 "$HOME/Desktop/Inventory Demo/overview.py" "$@"

Behåll citationstecknen. Det citerade "$@" skickar inkommande argument var för sig och bevarar därmed filnamn som innehåller blanksteg. Av samma anledning citeras sökvägen till skriptet. zsh-manualen beskriver positionsparametrar och separat expansion av citerade matriselement; Apples guide till Terminal förklarar också hur sökvägar citeras. Parametrar, Ange filer och mappar i Terminal.

Om Genvägar kräver att skriptkörning aktiveras väljer du Genvägar > Inställningar > Avancerat och markerar Tillåt körning av skript. Apple beskriver den här inställningen under tillåtelse att köra skript från en genväg. Avancerade inställningar i Genvägar.

Det konfigurerade flödet ser ut så här: valda filobjekt skickas in i genvägen, deras sökvägar blir skalskriptets argument och Python läser filerna och skriver översikten. Skalskriptåtgärdens lyckade textresultat är ett Created:-meddelande som innehåller målets sökväg. Det meddelandet är inte själva CSV-filen. Ingen efterföljande sparåtgärd behövs eftersom programmet redan har skapat filen.

Markera endast Birch.csv, Cedar.csv och Maple.csv i Finder. Kontrollklicka på markeringen och välj Snabbåtgärder > Inventory Overview. Om genvägen saknas använder du Mer > Anpassa för att granska vilka Finder-tillägg som är aktiverade och kontrollerar sedan vilka indatatyper genvägen godtar. Apple dokumenterar både anpassning av snabbåtgärder i Finder och hur du lägger till genvägar i den menyn. Utföra snabbåtgärder i Finder på Mac.

Kontrollera resultatet och hantera upprepade körningar

Öppna overview.csv från demomappen i Numbers. Med de syntetiska exempelfilerna ska innehållet vara:

Source file,Cell,Value,Status
Birch.csv,B3,12,present
Cedar.csv,B3,7,present
Maple.csv,B3,0,present

Kontrollera att det finns en utdatarad för varje vald källa och att filnamnen identifierar rätt tabeller. Exemplens värden är illustrativa, inte uppmätta inventeringsresultat. Programmet rapporterar om ett värde finns; det kontrollerar inte om värdet är ett giltigt antal.

Följ den här felsökningsordningen om något skiljer sig:

  1. Genvägen syns inte i Finder: kontrollera inställningen för Finder, att indata av typen Filer godtas och att tillägget är aktiverat.
  2. Körbar fil eller skript saknas: kontrollera Pythons sökväg och att overview.py fortfarande finns i den angivna demomappen.
  3. B3 saknas eller A3 är fel: granska källans exporterade poster och exportalternativ innan du ändrar programmet.
  4. En tom cell visas oväntat: granska B3; programmet lämnar avsiktligt tomma värden tomma.
  5. Målet finns redan: byt namn på den föregående tillfälliga översikten eller flytta den utanför källmappen innan du kör igen.

Du kan också anropa samma genväg från Terminal för att kontrollera hur indata skickas. Apple dokumenterar -i för att skicka filindata; om du i stället skickar en sökväg via en pipe skickas den som text. Använd filerna nedan uttryckligen, utan någon utdataflagga, eftersom Python-programmet sköter skapandet av utdata. Regeln om namnkonflikter gäller fortfarande. Köra genvägar från kommandoraden.

shortcuts run "Inventory Overview" -i \
  "$HOME/Desktop/Inventory Demo/Birch.csv" \
  "$HOME/Desktop/Inventory Demo/Cedar.csv" \
  "$HOME/Desktop/Inventory Demo/Maple.csv"

Varje ny översikt motsvarar CSV-filerna som valdes för den körningen. Om du ändrar ett kalkylblad måste du exportera det på nytt och köra programmet igen. Genom att behålla källfilnamnet, kontrollera den intilliggande etiketten och skilja tomma värden från noll blir den här lilla översikten enklare att verifiera inför nästa inventeringsgenomgång.

Källor