[object Object]

← back to Designer Wallcoverings

Add fill_sheet.py: batch-write Image1/2/Alt/Desc to Fentucci sheet (G:J); sheet ID is public, not a secret

b5a9363b4dd8aa06164edd27af3ff82d18d12042 · 2026-06-24 08:39:00 -0700 · Steve

Files touched

Diff

commit b5a9363b4dd8aa06164edd27af3ff82d18d12042
Author: Steve <steve@designerwallcoverings.com>
Date:   Wed Jun 24 08:39:00 2026 -0700

    Add fill_sheet.py: batch-write Image1/2/Alt/Desc to Fentucci sheet (G:J); sheet ID is public, not a secret
---
 pending-approval/fill_sheet.py | 74 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/pending-approval/fill_sheet.py b/pending-approval/fill_sheet.py
new file mode 100644
index 00000000..8ee822c2
--- /dev/null
+++ b/pending-approval/fill_sheet.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python3
+"""
+fill_sheet.py — write Image 1 / Image 2 / Alt / Description into the Fentucci
+grasscloth sourcing sheet (cols G/H/I/J), keyed by sheet row.
+
+CREDENTIAL: a service-account JSON from a project where the Google Sheets API is
+ENABLED (you pointed at project `sheets-updater-485823`). The sheet must be SHARED
+(Editor) with that service account's client_email.
+
+Setup (one time):
+  1. In console.cloud.google.com (project sheets-updater-485823):
+     IAM & Admin -> Service Accounts -> (pick/create one) -> Keys -> Add key ->
+     JSON. Download it.
+  2. Put the JSON somewhere, e.g.  ~/Projects/secrets-manager/sheets-updater-sa.json
+  3. Open the JSON, copy "client_email", and SHARE the sheet (Editor) with it.
+
+Run:
+  SA=~/Projects/secrets-manager/sheets-updater-sa.json python3 fill_sheet.py --dry   # preview
+  SA=~/Projects/secrets-manager/sheets-updater-sa.json python3 fill_sheet.py         # write
+
+Data source: /tmp/fentucci_filled.json  (list of {sheet_row,img1,img2,alt,description}).
+"""
+import os, sys, json, time
+import gspread
+
+SHEET_KEY = "1trKNm-ymqlbs96XJfndDUz19mzH8A11ktaw2lfQ2VQo"
+DATA      = os.environ.get("DATA", "/tmp/fentucci_filled.json")
+# columns: G=Image 1, H=Image 2, I=Alt Tags, J=Description
+COLS = {"img1": "G", "img2": "H", "alt": "I", "description": "J"}
+DRY  = "--dry" in sys.argv
+
+def find_sa():
+    p = os.environ.get("SA")
+    if p and os.path.exists(os.path.expanduser(p)):
+        return os.path.expanduser(p)
+    for cand in [
+        "~/Projects/secrets-manager/sheets-updater-sa.json",
+        "~/.config/ga-analytics-agent/service-account.json",
+    ]:
+        cand = os.path.expanduser(cand)
+        if os.path.exists(cand):
+            return cand
+    sys.exit("No service-account JSON. Set SA=/path/to/key.json (from a project with Sheets API enabled).")
+
+def main():
+    rows = json.load(open(DATA))
+    print(f"{len(rows)} rows from {DATA} | mode: {'DRY-RUN' if DRY else 'WRITE'}")
+    sa = find_sa()
+    email = json.load(open(sa)).get("client_email")
+    print(f"service account: {email}")
+    if DRY:
+        for r in rows[:5]:
+            print(f"  row {r['sheet_row']}: G={r.get('img1','')[:50]!r} I={r.get('alt','')!r}")
+        print(f"  ... ({len(rows)} rows). Re-run without --dry to write.")
+        return
+    gc = gspread.service_account(filename=sa)
+    ws = gc.open_by_key(SHEET_KEY).sheet1
+    # build one batch update: each row -> 4 cells G:J
+    batch = []
+    for r in rows:
+        sr = r["sheet_row"]
+        batch.append({"range": f"G{sr}:J{sr}",
+                      "values": [[r.get("img1") or "", r.get("img2") or "",
+                                  r.get("alt") or "", r.get("description") or ""]]})
+    # chunk to stay under request limits
+    CHUNK = 50
+    for i in range(0, len(batch), CHUNK):
+        ws.batch_update(batch[i:i+CHUNK], value_input_option="RAW")
+        print(f"  wrote rows {i+1}-{min(i+CHUNK,len(batch))} of {len(batch)}")
+        time.sleep(1)
+    print("DONE ✅  filled G/H/I/J for", len(batch), "rows")
+
+if __name__ == "__main__":
+    main()

← 2cbf5664 auto-save: 2026-06-24T08:25:44 (2 files) — shopify/theme-inf  ·  back to Designer Wallcoverings  ·  auto-save: 2026-06-24T08:55:52 (4 files) — shopify/scripts/c 784bf419 →