Add cards to your collection to track set completion.
No Card Searched Yet
Search for a Pokémon card above to view details, market prices, and sales history.
Add cards to your collection to track set completion.
Search for a Pokémon card above to view details, market prices, and sales history.
We found multiple sets matching your scan. Select the correct card below:
Fetching matching card details & prices...
Link your collection to Google Sheets to auto-save scanned cards in real-time!
Note: if you're upgrading from an older version of this app, re-paste this updated script and re-deploy (Deploy > Manage deployments > Edit > New version) so the new "Print Type" column is included. This keeps holofoil/reverse-holofoil/normal variants of the same card from colliding into one row.
function doGet(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var jsonArray = [];
sheets.forEach(function(sheet) {
var data = sheet.getDataRange().getValues();
if (data.length <= 1) return;
var headers = data[0];
for (var i = 1; i < data.length; i++) {
var row = data[i];
var record = {};
for (var j = 0; j < headers.length; j++) {
var key = headers[j];
var val = row[j];
if (val instanceof Date) {
val = Utilities.formatDate(val, Session.getScriptTimeZone(), "MM/dd/yyyy");
}
if (key === "Card Name") key = "name";
else if (key === "Number") key = "number";
else if (key === "Set Name") key = "setName";
else if (key === "Rarity") key = "rarity";
else if (key === "Print Type") key = "printType";
else if (key === "Qty") key = "quantity";
else if (key === "Date Added") key = "dateAdded";
else if (key === "Card ID") key = "id";
record[key] = val;
}
jsonArray.push(record);
}
});
return ContentService.createTextOutput(JSON.stringify(jsonArray)).setMimeType(ContentService.MimeType.JSON);
}
function doPost(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var params = JSON.parse(e.postData.contents);
if (params.action === 'add') {
var setName = params.setName || "General";
var sheet = ss.getSheetByName(setName);
if (!sheet) {
sheet = ss.insertSheet(setName);
sheet.appendRow(['Card Name', 'Number', 'Set Name', 'Rarity', 'Print Type', 'Qty', 'Date Added', 'Card ID']);
}
sheet.appendRow([params.name, params.number, params.setName, params.rarity, params.printType || 'normal', params.quantity || 1, params.dateAdded, params.id]);
return ContentService.createTextOutput(JSON.stringify({status:"success"})).setMimeType(ContentService.MimeType.JSON);
} else if (params.action === 'sync') {
var groups = {};
params.collection.forEach(function(c) {
var sName = c.setName || "General";
if (!groups[sName]) groups[sName] = [];
groups[sName].push(c);
});
var existingSheets = ss.getSheets();
Object.keys(groups).forEach(function(sName) {
var sheet = ss.getSheetByName(sName);
if (!sheet) {
sheet = ss.insertSheet(sName);
}
sheet.clearContents();
sheet.appendRow(['Card Name', 'Number', 'Set Name', 'Rarity', 'Print Type', 'Qty', 'Date Added', 'Card ID']);
groups[sName].forEach(function(c) {
sheet.appendRow([c.name, c.number, c.setName, c.rarity, c.printType || 'normal', c.quantity || 1, c.dateAdded, c.id]);
});
});
existingSheets.forEach(function(sheet) {
var sName = sheet.getName();
if (!groups[sName]) {
if (ss.getSheets().length > 1) {
ss.deleteSheet(sheet);
} else {
sheet.clearContents();
sheet.setName("General");
sheet.appendRow(['Card Name', 'Number', 'Set Name', 'Rarity', 'Print Type', 'Qty', 'Date Added', 'Card ID']);
}
}
});
return ContentService.createTextOutput(JSON.stringify({status:"success"})).setMimeType(ContentService.MimeType.JSON);
}
}
Loading set checklist...