Skip to content

Instantly share code, notes, and snippets.

@rcknr
Created December 16, 2012 23:03
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rcknr/4313985 to your computer and use it in GitHub Desktop.
Save rcknr/4313985 to your computer and use it in GitHub Desktop.
ScriptDb Viewer for Apps Script allows to inspect the contents of ScriptDb, run queries and sort stored objects. Works with scripts attached to a spreadsheet but can be also converted into a web app.
function showDbViewer() {
var DbViewer = UiApp.createApplication().setTitle('ScriptDb Viewer');
// Query field and button
DbViewer.add(
DbViewer.createHorizontalPanel().setVerticalAlignment(UiApp.VerticalAlignment.MIDDLE).add(
DbViewer.createTextBox().setText("{}").setId("query").setName("query"))
.add(
DbViewer.createButton("Query", DbViewer.createServerHandler("queryDb")
.addCallbackElement(DbViewer.getElementById("query")))
)
);
// SplitPanel with Listbox
DbViewer.add(
DbViewer.createSplitLayoutPanel().setHeight(240)
.addWest(
DbViewer.createListBox().setVisibleItemCount(10).setId("item").setName("id")
.addClickHandler(
DbViewer.createServerHandler("keyValueTable").addCallbackElement(DbViewer.getElementById("item")))
, 150)
.add(
DbViewer.createScrollPanel().setId("rightPane").setStyleAttribute("border", "1px inset"))
);
// Details bar
DbViewer.add(
DbViewer.createHorizontalPanel().setWidth("100%").add(
DbViewer.createHorizontalPanel().setSpacing(5).add(
DbViewer.createLabel("Total records:"))
.add(
DbViewer.createLabel().setId("total")))
.add(
DbViewer.createHorizontalPanel().setSpacing(5).add(
DbViewer.createLabel("Object size:"))
.add(
DbViewer.createLabel().setId("size"))
.setId("sizePanel")
)
.setCellHorizontalAlignment(DbViewer.getElementById("sizePanel"), UiApp.HorizontalAlignment.RIGHT)
);
queryDb();
SpreadsheetApp.getActiveSpreadsheet().show(DbViewer);
}
function queryDb(e) {
var DbViewer = UiApp.getActiveApplication();
var db = ScriptDb.getMyDb();
var ids = [];
if(!e) var query = {};
else if(e.constructor === Object) {
var query = Utilities.jsonParse(e.parameter.query);
}
var result = db.query(query);
var itemList = DbViewer.getElementById("item").clear();
while (result.hasNext()) {
var current = result.next();
ids.push(current.getId());
}
ids.sort();
for(n in ids) {
itemList.addItem(ids[n]);
}
itemList.setItemSelected(0, true);
// Show the number of records
DbViewer.getElementById("total").setText(ids.length);
// Refresh table
keyValueTable(ids[0]);
return DbViewer;
}
function keyValueTable(e) {
if(e.constructor === Object) {
var key = e.parameter.id;
var sort = e.parameter.item_tag;
var source = e.parameter.source;
}
else var key = e;
var DbViewer = UiApp.getActiveApplication();
var db = ScriptDb.getMyDb();
var object = db.load(key);
var keyValues = [];
var table = DbViewer.createFlexTable().setId(key).setCellSpacing(0).setCellPadding(3);
for(i in object) {
keyValues.push([i, object[i]]);
}
var labelKey = "Key";
var labelValue = "Value";
if(source && source == "key") {
if(sort=="key-asc") sort = "key-desc";
else sort="key-asc";
}
else if(source && source == "value") {
if(sort=="value-asc") sort = "value-desc";
else sort = "value-asc";
}
switch(sort) {
case "key-asc":
labelKey = labelKey+" ▲";
keyValues.sort().reverse();
break;
case "key-desc":
labelKey = labelKey+" ▼";
keyValues.sort();
break;
case "value-asc":
labelValue = labelValue+" ▲";
keyValues.sort(
function(a, b) {if (String(a[1]) > String(b[1])) return -1; if (String(a[1]) < String(b[1])) return 1; return 0;});
break;
case "value-desc":
labelValue = labelValue+" ▼";
keyValues.sort(
function(a, b) {if (String(a[1]) < String(b[1])) return -1; if (String(a[1]) > String(b[1])) return 1; return 0;});
break;
}
for(var n=0; n<keyValues.length; n++) {
table.insertRow(0).setText(0,0,keyValues[n][0]).setText(0,1,keyValues[n][1]);
// Row colors
if ((isEven(keyValues.length) && isEven(n)) || (!isEven(keyValues.length) && !isEven(n))) table.setRowStyleAttribute(0, "background", "#c4daff");
}
// Click handler for table header
var sortHandler = DbViewer.createServerHandler("keyValueTable")
.addCallbackElement(DbViewer.getElementById("item"))
.addCallbackElement(table);
// Add headers last
table.insertRow(0)
.setWidget(0, 0, DbViewer.createLabel(labelKey).setId("key").addClickHandler(sortHandler))
.setWidget(0, 1, DbViewer.createLabel(labelValue).setId("value").addClickHandler(sortHandler))
.setRowStyleAttributes(0,
{"font-weight":"bold", "background-image": "-webkit-linear-gradient(bottom, #F0F0F0 0%, #9E9E9E 100%)"});
DbViewer.getElementById("rightPane").clear().add(table);
// Set the sorting key
DbViewer.getElementById("item").setTag(sort);
// Show the size of the object
DbViewer.getElementById("size").setText(keyValues.length);
return DbViewer;
}
function isEven(n) {
return (n%2 == 0);
}
@raffaelepaparella
Copy link

Hi,
I put the script in a spreadsheet. How do I run it? thanks
raffaele

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment