Now, let's move on to the crucial step of converting the sheet into JSON format. For this task, I utilized App Script. If you're unfamiliar with it, App Script is a scripting language based on JavaScript. It allows you to fetch and modify data from the sheet. Once the script is ready, you can deploy it for external use. This is a great starting point if you're new to this process.
In this project, two primary commands were utilized:
This command is integral to the entire system as it retrieves data. Executing the following code will yield the fetched data:
```javascript
function FetchData()
{
var startingRow = 2
var end = SpreadsheetApp.getActiveSheet().getLastRow()
var lastColumn = SpreadsheetApp.getActiveSheet().getLastColumn() - 1
let lastColumnAplhabet = GetColumnByIndex(lastColumn)
var titles = SpreadsheetApp.getActiveSheet().getRange("Sheet1!A1:" + lastColumnAplhabet + "1").getValues()[0]
let data = SpreadsheetApp.getActiveSheet().getRange("Sheet1!A"+ startingRow + ":" + lastColumnAplhabet + "" + end).getValues()
// rows iteration
for (var i = 0; i < data.length; i++)
{
// column iteration
columnIndex = 0
for(var j = 0; j < data[i].length; j++)
{
var cell = data[i][j]
if(cell.toString() == "CellImage")
{
let value = SpreadsheetApp.getActiveSheet().getRange(GetColumnByIndex(columnIndex) + "" + startingRow).getFormula()
var regEx = /"(.*)"/gm
var url = regEx.exec(value)[1]
cell = url
}
columnIndex++
data[i][j] = cell
}
startingRow++
}
let output = []
for (var i = 0; i < data.length; i++)
{
let obj = {}
for(var j = 0; j < data[i].length; j++)
{
obj[titles[j]] = data[i][j];
}
output.push(obj)
}
return output
}
function GetColumnByIndex(column)
{
return String.fromCharCode(97 + column).toUpperCase()
}
```
In the aforementioned process, I retrieve all the data from the sheet. If the value corresponds to a Cell Image, I use a regular expression (regex) to extract the actual download URL. Here's how it works:
https://drive.google.com/uc?export=download&id=YOUR IMAGE ID
Once all the data has been fetched and filtered, I push it to the output and return it. The output is an array of dictionaries, where each dictionary consists of a key-value pair. The key represents the title, and the value represents the corresponding data.
After this Get Function is called:
```javascript
function doGet()
{
Logger.log(JSON.stringify(FetchData()))
return ContentService.createTextOutput(JSON.stringify(FetchData())).setMimeType(ContentService.MimeType.JSON);
}
```
This is the output JSON. You can run this to see the output JSON. It will be like this:
Edit Command:
This command is primarily utilized to alter the sheet or perform a specific action when an edit is made to the sheet. I've used it to apply a background color to a cell in the sheet, which allows the designer to identify the color. Here's the corresponding code:
```javascript
function onEdit(editData)
{
ChangeColor(editData)
}
function ChangeColor(editData)
{
range = editData.range
var rows = range.getNumRows()
var columns = range.getNumColumns()
var colors = []
for (var i = 1; i <= rows; i++)
{
var row = []
for (var j = 1; j <= columns; j++)
{
if(!isValidColor(range.getCell(i,j).getValue().toString()))
{
row.push("")
}else
{
row.push(range.getCell(i,j).getValue())
}
}
colors.push(row)
}
range.setBackgrounds(colors)
}
function isValidColor(str) {
return str.match(/^#[a-f0-9]{6}$/i) !== null;
}
```
To provide some context, I examine each cell to determine if its value is a valid HexCode. If it is, I change the cell's color. If it's not, I simply move on to the next cell.