Skip to content

Instantly share code, notes, and snippets.

@Rovsau
Last active October 10, 2023 04:00
Show Gist options
  • Save Rovsau/a91371a66aba870d6f3ebbc0c9afe65b to your computer and use it in GitHub Desktop.
Save Rovsau/a91371a66aba870d6f3ebbc0c9afe65b to your computer and use it in GitHub Desktop.
Parse a Spreadsheet range into a table for GitHub, Obsidian, etc.

Parse any spreadsheet range into a table for GitHub, Obsidian, etc.
Expects a header row.

/* Google Apps Script */

/**
 * Select any spreadsheet range, and return a string-parsed table for GitHub, Obsidian, etc. 
 * Note:  Obsidian requires a prefixed empty space for the header row, if the first cell is blank. 
 * @param {Array<Array>} array2d - The source range.
 * @customfunction
 */
function GetParsedTable(array2d) {
  var header = ParseHeader(GetHeader(array2d));
  var subheader = ParseSubHeader(GetSubHeader(array2d));
  var data = ParseData(GetData(array2d));
  return JoinStrings('\n', header, subheader, data);
}

function ParseHeader(array2d) {
  var prefix = array2d[0][0] === "" ? "|" : "";
  return prefix + Join2dArray([array2d[0]]);
}
function ParseSubHeader(array2d) {
  return Join2dArray(array2d);
}
function ParseData(array2d) {
  return Join2dArray(array2d);
}

function GetHeader(array2d) {
  if (array2d.length === 0) {
    return [[]];
  }
  else {
    return [array2d[0]];
  }
}

function GetSubHeader(array2d) {
  var columns = array2d[0].length;
  var newArray2d = new Array(1);
  newArray2d[0] = new Array(columns);
  newArray2d[0].fill('-');
  return newArray2d;
}

function GetData(array2d) {
  if (array2d.length <= 1) {
    return [[]];
  }
  else {
    return array2d.slice(1);
  }
}

function Join2dArray(array2d) {
  return array2d.map(row => row.join('|')).join('\n');
}

function JoinStrings(separator, ...args) {
  return args.join(separator);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment