Tak wygląda plik odzyskiwania wygenerowany przez AppSheet podczas pracy z użytkownikiem, który napotkał błąd. Zawiera on łańcuchowe dane JSON, które można łatwo przeanalizować, więc... przeanalizujmy je!
{
"tableName": "<<tableName>>",
"row": {
"Cart": "<<text>>",
"_RowNumber": "<<number>>",
"Type": "<<enum>>",
"Product": "<<text>>",
"Name": "<<text>>",
"Description": "<<long_text>>",
"Url": "<<text>>",
"Image": "<<text>>",
"Measure": "<<enum>>",
"On_Stock": "<<boolean>>",
"Wanted": "<<number>>",
"Missing": "<<number>>",
"Remarks": "<<text>>",
"ID": "<<rowId>>",
"AddedOn": "<<timestamp>>",
"AddedBy": "<<userId>>"
},
"appName": "<<appName>>",
"appId": "<<appId>>",
"appVersion": "<<appVersion>>",
"userSettings": {
"_RowNumber": "0",
"_EMAIL": "",
"_NAME": "",
"_LOCATION": "",
"Options Heading": "",
"Option 1": "",
"Option 2": "",
"Country Option": "",
"Language Option": "",
"Option 5": "",
"Option 6": "",
"Option 7": "",
"Option 8": "",
"Option 9": "",
"_THISUSER": "onlyvalue"
},
"mechanism": "Form",
"viewName": "Shortages_Form",
"type": "AddTableRow",
"requestId": 18006069,
"timestamp": "2024-11-19T11:23:33.097Z",
"failureCount": 0,
"syncToken": "<<syncToken>>",
"actionType": "AddTableRow",
"timeStamp": "2024-11-19T11:23:33.097Z"
}
Jak można zauważyć, dużo pracuję z AppSheet i Google Apps Script, co oznacza, że takie sytuacje, gdy występuje problem po stronie użytkownika zdarzają się, a w szczególności w aplikacjach z których korzysta wielu użytkowników. Jeśli jest tylko ~5 odrzuconych zmian, to prawdopodobnie nic się, nie dzieje ale co jeśli jest ich 100 lub nawet więcej? Byłoby wspaniale móc przywrócić te zmiany, prawda?
Oto prosty projekt appsheet_dataRecovery GAS, który pomaga przetworzyć wszystkie dokumenty w danym folderze (w tym przypadku folder _recoveryData), wyodrębnić niezbędne dane i zapisać je w arkuszu kalkulacyjnym ładnie pogrupowanym i zorganizowanym. Przed uruchomieniem tego projektu należy pobrać pliki wygenerowane przez AppSheet. Aby to zrobić, postępuj zgodnie z oficjalnymi instrukcjami.
function processRecoveryFilesToSpreadsheet() {
const spreadsheetId = 'your_spreadsheetId_to_store_recoveryData';
const folderId = 'your_recoveryData_folderId';
const folder = DriveApp.getFolderById(folderId);
const files = folder.getFiles();
const ss = SpreadsheetApp.openById(spreadsheetId);
while (files.hasNext()) {
const file = files.next();
processSingleRecoveryFile(file, ss);
}
}
function processSingleRecoveryFile(file, ss) {
try {
const recoveryEntry = JSON.parse(file.getBlob().getDataAsString());
const tableName = recoveryEntry.tableName;
const type = recoveryEntry.type;
const row = recoveryEntry.row;
let sheet = ss.getSheetByName(tableName);
if (!sheet) {
sheet = ss.insertSheet(tableName);
let headers = Object.keys(row);
sheet.appendRow(headers);
}
// simple introduction logic - write your own!
if (type === "AddTableRow" || type === "UpdateTableRow") {
let rowValues = [];
let headers = Object.keys(row);
headers.forEach(header => rowValues.push(row[header]));
sheet.appendRow(rowValues);
} else if (type === "DeleteTableRow") {
Logger.log(`Record to be deleted (ID: ${recoveryEntry.rowKey}, table name: ${tableName})`);
} else {
Logger.log(`Unknown operation type: ${type}`);
}
} catch (error) {
Logger.log(`There was an error while processing the document ${file.getName()}: ${error}`);
}
}
Powyższy skrypt jest tylko podstawową wersją tego, co można osiągnąć w GAS, aby zaprezentować koncepcję. Wyjaśnię to trochę.
Skrypt otwiera folder, w którym przechowywane są pliki odzyskiwania i za pomocą pętli while przetwarza wszystkie znalezione pliki.
Poniżej znajdują się przykładowe wiersze wygenerowane przez to rozwiązanie. Możesz łatwo sprawdzić wszystko, a jeśli używasz Arkuszy Google jako bazy danych, możesz po prostu skopiować-wkleić wyniki i bum, gotowe! 🚀
Ten projekt jest dość prosty.
Każdy zaznajomiony z programowaniem powinien z łatwością zrozumieć jego koncepcję.
Zachęcam do dostosowania go do własnych potrzeb.
Mam nadzieję, że ten artykuł okazał się dla Ciebie interesujący.
Do następnego! 👋🏼