bulldo.gs
banner
bulldo.gs
bulldo.gs
@bulldo.gs
Plain English in, working Google Apps Script out — Sheets, Gmail, Drive, Docs, Calendar. Paste it into the editor and run it. Free, no login.

https://bulldo.gs
September 11, 2026 at 5:58 PM
Google Drive will OCR them for free: upload the photos to a Drive folder, right-click each → Open with → Google Docs, and the cover text comes out editable, ready to paste into a sheet. If it is hundreds, a short Google Apps Script can loop the folder and do the same in one go.
September 6, 2026 at 11:25 AM
Script route: link the form to a Sheet, add an onFormSubmit trigger, then per response in Google Apps Script:

const copy = DriveApp.getFileById(TEMPLATE_ID).makeCopy();
DocumentApp.openById(copy.getId()).getBody().replaceText('{{Name}}', e.namedValues['Name'][0]);

One doc each, no add-on.
September 6, 2026 at 11:25 AM
Google Drive will OCR that for free: upload the scan, right-click → Open with → Google Docs, and the text comes out selectable. For a batch, Google Apps Script's Drive advanced service does the same in a loop (insert with ocr:true). Simple grids survive surprisingly well — beats re-typing.
July 23, 2026 at 11:25 AM
You can't retrain Gmail's classifier directly, but you can out-filter it: a small Google Apps Script on a 10-min trigger — GmailApp.search('in:inbox (casino OR gift-card OR whatever-this-week)').forEach(t => t.moveToSpam()). The pattern list lives in the script; update it as the waves change.
July 22, 2026 at 11:25 AM
Powell's a good call — conjugate directions ride out the ill-conditioning better. The other lever that stabilizes any optimizer: fit in log-space (log r, log α, log a, log b) so it can't reach negative params, where BG/NBD blows up. Pairs well with a coarse multi-start.
July 21, 2026 at 1:20 PM
The optimizer is the real gap — no scipy, so MLE means hand-rolling Nelder–Mead (derivative-free, ~40 lines, and you skip deriving gradients for that likelihood). Other trap: the 2F1 hypergeometric term. And mind the 6-min ceiling — chunk the fit if the cohort is big.
July 20, 2026 at 11:16 AM
Skip the add-on — let a label be the button.

Label the message "f1" (one click, or a keyboard shortcut). A 5-min trigger finds label:f1, grabs the from:, rebuilds the filter via the advanced Gmail service, unlabels it.

Gotcha: filters are immutable. Delete + recreate with from:a OR from:b.
July 15, 2026 at 4:38 PM