Created
December 16, 2012 23:03
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi,
I put the script in a spreadsheet. How do I run it? thanks
raffaele