**On January 27, 2021, Google is changing the required permissions for attaching IAM roles to service accounts. If you are using IAM roles for your Google service accounts, please see Changes to User Management.**

This example covers the following functions:

`ARRAYINDEXOF`

- Returns the index value of an array for the specified value, searching from left to right. See ARRAYINDEXOF Function.`ARRAYRIGHTINDEXOF`

- Returns the index value of an array for the specified value, searching from right to left. See ARRAYRIGHTINDEXOF Function.

**Source:**

The following set of arrays contain results, in order, of a series of races. From this list, the goal is to generate the score for each racer according to the following scoring matrix.

Place | Points |
---|---|

1st | 30 |

2nd | 20 |

3rd | 10 |

Last | -10 |

Did Not Finish (DNF) | -20 |

Results:

RaceId | RaceResults |
---|---|

1 | ["racer3","racer5","racer2","racer1","racer6"] |

2 | ["racer6","racer4","racer2","racer1","racer3","racer5"] |

3 | ["racer4","racer3","racer5","racer2","racer6","racer1"] |

4 | ["racer1","racer2","racer3","racer5"] |

5 | ["racer5","racer2","racer4","racer6","racer3"] |

** Transformation:**

Note that the number of racers varies with each race, so determining the position of the last racer depends on the number in the event. The number of racers can be captured using the following:

Transformation Name | `New formula` |
---|---|

Parameter: Formula type | `Single row formula` |

Parameter: Formula | `ARRAYLEN(RaceResults)` |

Parameter: New column name | `'countRacers'` |

Create columns containing the index values for each racer. Below is the example for `racer1`

:

Transformation Name | `New formula` |
---|---|

Parameter: Formula type | `Single row formula` |

Parameter: Formula | `ARRAYINDEXOF(RaceResults, 'racer1')` |

Parameter: New column name | `'arrL-IndexRacer1'` |

Transformation Name | `New formula` |
---|---|

Parameter: Formula type | `Single row formula` |

Parameter: Formula | `ARRAYRIGHTINDEXOF(RaceResults, 'racer1')` |

Parameter: New column name | `'arrR-IndexRacer1'` |

You can then compare the values in the two columns to determine if they are the same.

**NOTE: **If ARRAYINDEXOF and ARRAYRIGHTINDEXOF do not return the same value for the same inputs, then the value is not unique in the array.

Since the points awarded for 1st, 2nd, and 3rd place follow a consistent pattern, you can use the following single statement to compute points for podium finishes for `racer1`

: computing based on the value stored for the left index value:

Transformation Name | `Conditional column` |
---|---|

Parameter: Condition type | `if...then...else` |

Parameter: If | `{arrayL-IndexRacer1} < 3` |

Parameter: Then | `(3 - {arrayL-IndexRacer1}) * 10` |

Parameter: Else | `0` |

Parameter: New column name | `'ptsRacer1'` |

The following transform then edits the `ptsRacer1`

to evaluate for the Did Not Finish (DNF) and last place conditions:

Transformation Name | `Edit column with formula` |
---|---|

Parameter: Columns | `ptsRacer1` |

Parameter: Formula | `IF(ISNULL({arrayL-IndexRacer1}), -20, ptsRacer1))` |

You can use the following to determine if the specified racer was last in the event:

Transformation Name | `Edit column with formula` |
---|---|

Parameter: Columns | `ptsRacer1` |

Parameter: Formula | `IF(arrR-IndexRacer1 == countRacers, -10, ptsRacer1)` |

**Results:**

RaceId | RaceResults | countRacers | arrR-IndexRacer1 | arrL-IndexRacer1 | ptsRacer1 |
---|---|---|---|---|---|

1 | ["racer3","racer5","racer2","racer1","racer6"] | 5 | 3 | 3 | 0 |

2 | ["racer6","racer4","racer2","racer1","racer3","racer5"] | 6 | 3 | 3 | 0 |

3 | ["racer4","racer3","racer5","racer2","racer6","racer1"] | 6 | 5 | 5 | -10 |

4 | ["racer1","racer2","racer3","racer5"] | 4 | 0 | 0 | 20 |

5 | ["racer5","racer2","racer4","racer6","racer3"] | 5 | null | null | -20 |

** **

This page has no comments.