Untuk mengumpulkan sel yang sama dari tabel inventaris berulang, ekspor setiap tabel sebagai CSV, lalu jalankan pintasan Finder yang membaca posisi tersebut dan membuat ikhtisar. Panduan ini mengumpulkan B3, mempertahankan nama setiap file sumber, dan menolak menimpa hasil yang sudah ada.

Pilih input yang tepat sebelum membuat pintasan

Alur kerja ini ditujukan bagi orang yang mengelola beberapa tabel inventaris dengan tata letak yang sama dan ingin membuat satu baris untuk setiap tabel dalam ikhtisar terpisah. Contohnya menggunakan tiga file sementara yang berisi jumlah sintetis. Setiap file mewakili satu tabel yang diekspor; targetnya adalah kolom B, baris 3, termasuk baris header.

Bedakan tiga hal: dokumen spreadsheet, tabel di dalamnya, dan file CSV yang diekspor. Dokumentasi Numbers dari Apple mengizinkan ekspor CSV sebagai file terpisah untuk setiap tabel atau dengan tabel digabungkan. Untuk tugas ini, pilih file terpisah: penggabungan tabel dapat mengubah letak catatan target. Ekspor CSV berisi nilai sel, sehingga ikhtisar yang dihasilkan merupakan cuplikan. Mengekspor ke format file lain di Numbers pada Mac.

Pintasan di bawah ini menyerahkan ekstraksi kepada program Python kecil. Program ini tidak memperlakukan dokumen Numbers atau buku kerja Excel sebagai teks biasa, dan tidak mengasumsikan bahwa menerima file spreadsheet berarti suatu tindakan dapat mengakses selnya. Apple mendokumentasikan cara memeriksa input yang diterima suatu tindakan dan output yang dihasilkan melalui panel informasinya. Gunakan panel tersebut saat memeriksa tindakan yang tersedia di Mac Anda. Menelusuri daftar tindakan di Pintasan pada Mac.

Gunakan tabel keputusan ini sebelum memulai:

Kondisi awal Persiapan untuk alur kerja ini
Satu tabel yang cocok di setiap dokumen Numbers Ekspor setiap tabel sebagai CSV.
Beberapa tabel yang cocok dalam satu dokumen Ekspor sebagai file CSV terpisah dan tentukan tabel yang dimaksud.
File CSV dengan pemisah koma yang sudah ada Pastikan pengodean, tata letak, dan posisi targetnya.
Tata letak berbeda atau baris inventaris yang bergeser Seragamkan contoh sementara terlebih dahulu; koordinat tetap saja tidak dapat mengidentifikasi jumlah yang dimaksud.

Untuk contoh ini, setiap sumber harus memiliki Counted units di A3 dan nilai yang diinginkan di B3. Memeriksa label di sebelahnya menambahkan petunjuk diagnostik yang berguna: baris yang bergeser akan menghentikan proses alih-alih diam-diam mengumpulkan nilai yang tidak terkait. Pemeriksaan ini tidak dapat mendeteksi setiap kemungkinan kesalahan tata letak, jadi pastikan kedua sel saat menyiapkan input.

Siapkan file inventaris sementara

Untuk contoh ini, Anda perlu memasang Python 3 secara terpisah. Dengan penginstal standar dari situs web Python, tautan yang dapat dieksekusi ditempatkan di /usr/local/bin/. Perintah di bawah secara eksplisit menggunakan /usr/local/bin/python3, sehingga tidak bergantung pada jalur pencarian perintah milik pintasan. Ikuti petunjuk pemasangan untuk rilis Python yang didukung, lalu pastikan perintah ini berfungsi. Menggunakan Python di macOS.

/usr/local/bin/python3 --version

Jika jalur tersebut tidak ada, selesaikan pemasangan Python sebelum melanjutkan. Program ini hanya menggunakan pustaka standar Python; tidak diperlukan paket tambahan. Panduan Terminal dari Apple menjelaskan bahwa perintah dapat dijalankan menggunakan nama jalur lengkap file yang dapat dieksekusi, diikuti argumennya. Menjalankan perintah dan alat di Terminal pada Mac.

Untuk membuat input sintetis, tempelkan perintah lengkap ini ke Terminal. Perintah ini membuat Inventory Demo di Desktop Anda dan berhenti jika folder tersebut sudah ada. Gunakan folder sementara yang baru, alih-alih menggabungkan contoh ini ke direktori yang sudah ada.

/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

Untuk menguji langkah ekspor Numbers secara terpisah, buka satu CSV sementara di Numbers dan ekspor ke folder sementara lain menggunakan File > Export To > CSV. Pilih satu file untuk setiap tabel, biarkan Include table names tidak dicentang, dan gunakan pengodean UTF-8. Periksa tabel yang diekspor untuk memastikan A3 dan B3 masih berisi label dan nilai yang dimaksud. Apple mendokumentasikan opsi ekspor ini. Pengaturan ekspor Numbers.

Jangan mengganti ekstensi spreadsheet menjadi .csv sebagai pengganti ekspor. Program ini memerlukan teks dengan pemisah koma yang sebenarnya. Simpan ketiga file CSV sintetis asli bersama-sama untuk panduan berikut.

Buat program untuk menyusun ikhtisar

Simpan program lengkap berikut sebagai overview.py di dalam Inventory Demo, menggunakan editor teks biasa. Pastikan nama file berakhiran .py, bukan .py.txt. Program ini menerima jalur file sumber sebagai argumen, membaca B3, lalu membuat overview.csv di folder bersama file-file tersebut.

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:]))

Program ini menggunakan pengurai CSV, alih-alih memisahkan teks pada koma atau jeda baris. Fungsi reader Python mengembalikan kolom sebagai string, dan dokumentasinya menetapkan bahwa file CSV harus dibuka dengan newline="". Cara ini menangani kolom berpetik yang berisi koma atau jeda baris di dalamnya. Program mempertahankan nilai yang diekstrak tanpa menjumlahkannya atau mengubahnya menjadi angka. Membaca dan menulis file CSV.

Beberapa batasan yang disengaja membuat hasilnya lebih mudah diperiksa. Setiap input harus ada, semua jalur sumber yang telah diresolusi harus berada dalam satu folder, dan jalur yang sama setelah diresolusi akan ditolak jika muncul lebih dari sekali. Program mengurutkan berdasarkan nama file, bukan berdasarkan urutan pemilihan di Finder. Program juga menolak input bernama overview.csv, sehingga hasil sebelumnya tidak ikut disertakan secara tidak sengaja.

Semua sumber dibaca dan diperiksa sebelum pembuatan output dimulai. B3 yang tidak ada atau label tak terduga di A3 akan menghentikan proses. B3 yang ada tetapi kosong menghasilkan baris berlabel blank; nilai 0 tetap menjadi 0 dan diberi label present. Jadi, sel yang tidak ada, sel kosong, dan jumlah nol menghasilkan keluaran yang berbeda.

Output menggunakan mode pembuatan eksklusif, "x". Dokumentasi Python menyatakan bahwa mode ini gagal jika tujuan sudah ada. Karena itu, program tidak mengganti ikhtisar sebelumnya atau membuat nama file bernomor. Namun, kegagalan saat proses penulisan berlangsung tetap dapat meninggalkan file baru yang tidak lengkap; periksa file yang tertinggal setelah kesalahan penulisan sebelum mencoba lagi. Mode pembukaan file Python.

Hubungkan program ke pintasan Finder

Buat pintasan bernama Inventory Overview di Pintasan. Buka Details, aktifkan Use as Quick Action, lalu pilih Finder. Dalam konfigurasi input, biarkan Files aktif dan nonaktifkan jenis konten yang tidak terkait. Apple mendokumentasikan ketersediaan Finder untuk pintasan yang menerima file atau folder, serta kontrol untuk membatasi input yang diterima. Menjalankan pintasan saat bekerja di Mac, Membatasi input untuk pintasan.

Atur perilaku saat tidak ada input menjadi Stop and Respond, dengan pesan seperti Select the source CSV files in Finder. Ini mencegah pemilihan kosong menjadi proses yang ambigu. Opsi dan kolom responsnya dijelaskan dalam panduan konfigurasi input Apple. Memilih respons saat tidak ada input.

Tambahkan Run Shell Script. Atur Shell ke /bin/zsh, hubungkan Input ke Shortcut Input, dan atur Pass Input ke as arguments. Ganti skrip contoh dengan perintah lengkap berikut:

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

Biarkan tanda petiknya. "$@" yang diberi tanda petik meneruskan argumen masuk secara terpisah, sehingga nama file yang berisi spasi tetap utuh. Jalur skrip diberi tanda petik dengan alasan yang sama. Panduan zsh mendokumentasikan parameter posisi dan perluasan terpisah atas elemen larik yang diberi tanda petik; panduan Terminal Apple juga menjelaskan pemberian tanda petik pada nama jalur. Parameter, Menentukan file dan folder di Terminal.

Jika Pintasan meminta agar skrip diaktifkan, pilih Shortcuts > Settings > Advanced, lalu pilih Allow Running Scripts. Apple mendokumentasikan pengaturan ini pada bagian mengizinkan skrip dijalankan dari pintasan. Pengaturan lanjutan Pintasan.

Alur yang dikonfigurasi adalah: objek file yang dipilih masuk ke pintasan, jalurnya menjadi argumen shell, lalu Python membaca file tersebut dan menulis ikhtisar. Hasil teks yang berhasil dari tindakan shell adalah pesan Created: yang memuat nama jalur tujuan. Pesan itu bukan file CSV-nya. Tidak diperlukan tindakan penyimpanan lanjutan karena program sudah membuat file tersebut.

Di Finder, pilih hanya Birch.csv, Cedar.csv, dan Maple.csv. Control-klik pilihan tersebut dan pilih Quick Actions > Inventory Overview. Jika pintasan tidak muncul, gunakan More > Customize untuk memeriksa ekstensi Finder yang diaktifkan, lalu periksa kembali jenis input yang diterimanya. Apple mendokumentasikan kustomisasi Quick Actions Finder serta cara menambahkan pintasan ke menu tersebut. Melakukan tindakan cepat di Finder pada Mac.

Periksa hasil dan tangani proses yang dijalankan ulang

Buka overview.csv dari folder demo di Numbers. Dengan file sintetis yang disediakan, isinya seharusnya sebagai berikut:

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

Pastikan ada satu baris output untuk setiap sumber yang dipilih dan nama filenya menunjukkan tabel yang dimaksud. Nilai dalam contoh hanya ilustrasi, bukan hasil pengukuran inventaris. Program melaporkan apakah suatu nilai ada; program tidak memeriksa apakah nilainya merupakan jumlah yang valid.

Gunakan urutan diagnosis ini jika ada yang berbeda:

  1. Tidak ada pintasan di Finder: periksa pengaturan Finder, input Files yang diterima, dan ekstensi yang diaktifkan.
  2. File yang dapat dieksekusi atau skrip tidak ditemukan: pastikan jalur Python benar dan overview.py tetap berada di folder demo yang ditentukan.
  3. B3 tidak ada atau A3 salah: periksa catatan sumber yang diekspor dan opsi ekspor sebelum mengubah program.
  4. Ada nilai kosong yang tidak terduga: periksa B3; program memang mempertahankan nilai kosong.
  5. Tujuan sudah ada: ganti nama ikhtisar sementara sebelumnya atau pindahkan ke luar folder sumber sebelum menjalankan ulang.

Anda juga dapat menjalankan pintasan yang sama dari Terminal untuk memeriksa jalur input. Apple mendokumentasikan -i untuk meneruskan input file; menyalurkan jalur file lewat pipe akan meneruskan teks. Gunakan file-file eksplisit di bawah ini tanpa opsi output karena program Python yang menangani pembuatan output. Aturan benturan nama yang sama tetap berlaku. Menjalankan pintasan dari baris perintah.

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

Setiap ikhtisar baru mewakili file CSV yang dipilih untuk proses tersebut. Perubahan pada spreadsheet memerlukan ekspor dan proses baru. Dengan mempertahankan nama file sumber, memeriksa label di sebelahnya, dan membedakan nilai kosong dari nol, ikhtisar kecil ini lebih mudah diverifikasi sebelum digunakan untuk tinjauan inventaris berikutnya.

Sumber