Skip to content

Number Array sample

This is an example which creates two formulas that each take in an array of numbers and return the greatest common denominator and least common multiple.

// This import statement gives you access to all parts of the Coda Packs SDK.
import * as coda from "@codahq/packs-sdk";

// This import statement gives you access to all parts of the Coda Packs SDK.
export const pack = coda.newPack();

// We'll use an array of numbers in *both* formulas.
const numberArray = coda.makeParameter({
  type: coda.ParameterType.NumberArray,
  name: "Numbers",
  description: "the numbers you want to calculate",
});

// We'll also use this helper function that finds the gcd of two numbers in
// both formulas.
function gcd(a, b) {
  if (a === 0) {
    return b;
  }
  return gcd(b % a, a);
}

// This line adds a new formula.
pack.addFormula({
  // This is the name that will be called in the formula builder. Remember, your
  // formula name cannot have spaces in it.
  name: "GCD",
  description: "Returns the greatest common denominator for an array",

  // The needed array of numbers has already been defined above.
  parameters: [numberArray],

  // In this formula, we're returning a number in the Coda doc.
  resultType: coda.ValueType.Number,

  // Everything inside this execute statement will happen anytime your Coda
  // function is called in a doc. An array of all user inputs is always the 1st
  // parameter.
  execute: async function ([numberArray]) {
    let gcdResult = numberArray[0];

    for (let i = 1; i < numberArray.length; i++) {
      gcdResult = gcd(numberArray[i], gcdResult);

      if (gcdResult === 1) {
        return 1;
      }
    }
    return gcdResult;
  },
});

// Now, we'll define and add the second formula to the pack.
pack.addFormula({
  name: "LCM",
  description: "Returns the least common multiple for an array",
  parameters: [numberArray],
  resultType: coda.ValueType.Number,
  execute: async function ([numberArray]) {
    let lcmResult = numberArray[0];

    for (let i = 1; i < numberArray.length; i++) {
      lcmResult = (numberArray[i] * lcmResult) / gcd(numberArray[i], lcmResult);
    }

    return lcmResult;
  },
});