Coda & Email lijst in schijven

Christiaan Huizer
6 min readNov 21, 2020

--

Stel je hebt een grote lijst met emails en je wil deze in delen via Coda verzenden. De achtergrond kan bijvoorbeeld de verwerking van de reacties zijn; krijg je er teveel in één keer, dan kunnen de reacties niet adequaat behandeld worden en ontstaan er klachten. Wat denk je van dit:

Rabobank kan het even niet aan

Deze blog is voor gevorderden met dat voorkennis van automatisatie veronderstellen.

De opbouw van je document

Er is ten minste één pagina waar de hoofdtabel leeft met alle email adressen en met aanvullende gegevens zoals naam, voornaam, leeftijd etc. Er is een andere pagina waar de tweede tabel woont, de tabel die we beetje bij beetje vullen. We laten dus de gegevens vanuit de hoofdtabel doorstromen naar de tweede tabel.

Opbouw voorbeeld

We tonen om praktische redenen beide tabellen op één pagina. De tabellen hebben alleen een email adres. De overige gegevens laten we achterwege. We kiezen hier voor het verzenden van 6 emails per dag. Dat is niet veel, echter zo zie je de opbouw. Dit zijn de stappen de we overlopen

  • we hebben een tabel met emailadressen
  • we maken ze random
  • we voorzien een logica om max 10 emails per dag te versturen
  • we hebben een button om het proces te activeren. De automatisatie die je kan toevoegen, bespreek ik kort onderaan.

De basisformules

Hoe maken we de emaillijst random? Dat doen we in deze stappen:

  • we voegen een kolom toe met de functie Random() . Coda zal de random nummers bijwerken en ten tweede zet je de Sorteer functie aan via opties in de kolom. Zo zie je de rijen verspringen, elke keer wordt het random nummer naar de juiste positie gesorteerd.
  • we voegen de functie Find() toe om alle rijen te voorzien van opeenvolgende nummers. In andere omstandigheden is dat 1,2,3,4 en zo verder. Echter hier kan de pagina de veranderingen niet bijhouden en staan de getallen door elkaar. Niettemin de getallen zijn toch oplopend (weliswaar onzichtbaar) en daar maken we gebruik van.
  • We voegen boven de tabel een Slider toe waarmee we een aantal kunnen kiezen (1–10).
  • Deze slider brengen we in verband met de Checkbox. We willen het aantal vinkjes hebbend dat overeenkomt met de keuze van de silder. Dit is het aantal emails dat we gaan ‘selecteren’ om te verplaatsen van tabel 1 naar tabel 2.
  • het selecteren van de emails doen we in de kolom Checkbox met onderstaande formule. Zo nemen we altijd de deelverzameling van de eerste vier of zes of tien op basis van de slider en de kolom finding.
  • Om te weten hoeveel groepen je hebt, is er de functie in de kolom Groups waarbij ik het aantal rijen tel in de kolom, dit deel door de waarde uit de slider via Quotient en de afronding naar boven gaat omdat je bij 21 rijen en schijfjes van 5 zo 5 groepjes hebt. Immers 20 / 5 = 4, je hebt er dan nog één over die gaat dan moederziel alleen in het vijfde groepje.
Random number
Random()
Finding
Find(thisRow,thisTable)
Checkbox
thisRow.finding <= [Slider To Define Email Groups]
Groups
Roundup(Quotient(thisTable.Count(),[Slider To Define Email Groups]),0)

We kunnen nu de eerste 4 of 5 of 6 rijen selecteren en deze doorsturen naar de volgende tabel. Dat doen we met onderstaande formule. We filteren op de aangevinkte Checkbox, we kiezen voor de kolom email, we voegen een rij toe en doen dat keer op keer via FormulaMap, nadien verwijderen we deze rijen.

RunActions([Main Email Table].Filter(Checkbox=true).email.FormulaMap(AddRow([Email storage],[Email storage].emails,CurrentValue)),DeleteRows(Filter([Main Email Table], Checkbox=true)))
van tabel één naar tabel twee

De moedertabel is leeg, door handmatig de button te bedienen of door een automatisatie te bedienen. Automatisatie kan bijvoorbeeld door het systeem te vragen elke werkdag de knop in te drukken om 10u. Dat rechts eenvoudig in te stellen. Wat nu als je tabel leeg is? Dat komt er toch een keer van.

een lege tabel — hoe vul je deze weer?

De moedertabel opnieuw vullen, kan dat?

Helaas niet met deze tabel in mijn voorbeeld. De reden is eenvoudig. De kolommen worden deels aangestuurd door formules, zoals die waarin de email adressen staan. Daar gebruik ik een concatenate() zodat ik snel test materiaal heb: een nieuwe rij is een nieuw emailadres. Dit is typisch voor een testomgeving, echter in een realistisch scenario heb je gegevens die niet worden opgebouwd door een formule en is het wel mogelijk. Er is nog wel een bijzonderheid en dat is dat we in deze blog werken we met één waarde, het email adres en deze aansturen via een knop buiten de tabel. In mijn blog over het samenvoegen van email lijsten, maakt ik duidelijk dat voor het overzetten van meerdere waarden zoals de voornaam, de bron je knoppen binnen de tabel dient te gebruiken. Deze kun je dan vervolgens aansturen via één andere knop buiten de tabel. Dit terzijde.

De voorwaarde voor een lege tabel is dat het aantal rijen gelijk is aan 0. Dan zijn immers alle rijen en overgezet naar tabel 2 en daarna verwijderd. De functie mag dus niet werken als het aantal rijen groter is dan 0. De logica om te vullen op basis van een email adres, hebben we al we al en voegen we toe.

We testen eerst de basisformules.

[Bron tabel].Email.FormulaMap(AddRow(Doeltabel,Doeltabel.email, CurrentValue))De 'disable' logica:
Doeltabel.Count()>0
Let op: In de middelste screenshot is de uitkomst 'true' en bij de rechtste 'false' en is de knopkleur navenant.
De opbouw van de test code

Nu dit werkt, is het zaak de andere formule er mee in verband te brengen. Dat doen we door via een Ifje. Immers zouden we de disable functie gebruiken dan zou de gehele actie elke keer onmogelijk zijn als niet aan de voorwaarde van nul rijen voldaan zou worden en zou niets werken. Het doel is één knop die het ons makkelijk maakt.

We verwisselen nu de namen ‘doel’ en ‘bron’ zodat we een realistische opbouw hebben:

Beetje bij beetje van bron naar doel. Eens de bron tabel leeg is , dan deze opnieuw vullen.

1 | werkende gedeelte om beetje bij beetje de rijen over te zetten en te verwijderen.RunActions([Bron tabel].Filter(Checkbox=true).Email.FormulaMap(AddRow([Doel Tabel],[Doel Tabel].email,CurrentValue)), DeleteRows(Filter([Bron tabel], Checkbox=true))2 | voorwaarde De 'disable' logica:
([Bron tabel).Count()= 0
3 | het werkende resultaatIF([Bron tabel].Count() = 0, [Doel Tabel].email.FormulaMap(AddRow([Bron tabel],[Bron tabel].Email,CurrentValue)),RunActions([Bron tabel].Filter(Checkbox=true).Email.FormulaMap(AddRow([Doel Tabel],[Doel Tabel].email,CurrentValue)), DeleteRows(Filter([Bron tabel], Checkbox=true)))) <- van RunActions
) <- van ifje

RunActions() heeft als voordeel dat de volgorde die je aanhoudt in de opbouw, bepalend is voor de volgorde van de uitvoering.

Heb je nog vragen? Stel ze gerust.

Mijn naam is Christiaan Huizer en ik ben eigenaar van Huizer Automatisatie. In mijn rol als bedrijfsadviseur ben ik actief in het midden- en kleinbedrijf in Wallonië, Brussel, Vlaanderen en Nederland. Mijn klanten vragen me vooral om hun bedrijf voordelig te vereenvoudigen en versnellen. Ik maak daarbij gebruik van tools als AirTable, Coda, Zapier, MailJet en PaperForm.

Huizer Automatisatie over het segmenteren van email lijsten

--

--

Christiaan Huizer

I write about Coda.io - AI and (HR )planning challenges. You find blogs for beginners and experienced makers. I publish about once per week. Welcome!