← 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
A pending-approval/fill_sheet.py
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 →