/**
* @OnlyCurrentDoc
*/
function Refresh(e){
// Check if key code was changed
if (e.range.getValue() == SpreadsheetApp.getActiveSpreadsheet().getRange("KeyCode").getValue()) {
Fetch({}, true);
// Check if refresh interval setting was changed
} else if (e.range.getValue() == SpreadsheetApp.getActiveSpreadsheet().getRange("RefreshSetting").getValue()) {
CreateTrigger();
}
}
function RefreshButton(e){
Fetch({}, false, true);
}
function Fetch(triggerInfo, new_key, buttonClicked, attempt) {
// Check if key was changed and set Loading message
new_key = new_key || false;
buttonClicked = buttonClicked || false;
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var old_timestamp = sheet.getRange("raw_data!A1").getValue();
var key = sheet.getRange("KeyCode").getValue();
var attempt = attempt || 1;
// If there is a key, fetch the csv data
if (key.length > 0) {
var options =
{
// Ensure a fresh copy of the csv file is fetched every time.
headers : {'Cache-Control' : 'max-age=0', 'Content-Type' : 'application/json' }
};
try {
var response = UrlFetchApp.fetch("https://data.wowaudit.com/shadowlands/" + key + ".json", options).getContentText();
} catch(e) {
if (attempt > 3) {
var response = false;
} else {
return Fetch(triggerInfo, new_key, buttonClicked, attempt + 1);
}
}
// Only parse the data if the request returned data
if (response) {
sheet.getRange("raw_data!A1").setValue("Loading...");
var json = JSON.parse(response);
var data = [];
var row_data = [];
for (var row = 0; row < json.length; row++ ) {
row_data=[];
for (var column = 0; column < json[0].length; column++ ){
row_data.push(json[row][column]);
}
data.push(row_data);
}
sheet.getRange("raw_data!A1").offset(0, 0 ,json.length, json[0].length).setValues(data);
sheet.getRange("raw_data!A1").offset(json.length, 0, 102, json[0].length).clearContent();
// Don't update row visibility if the data is refreshed through the button,
// As it's possible that the person who clicked doesn't have access to the sheet.
if (!buttonClicked) {
UpdateRowVisibility(sheet, json.length);
}
} else if (new_key) {
// Wipe everything if there is no data and the key was changed
sheet.getRange("raw_data!A1").offset(0, 0, 102, 300).clearContent();
UpdateRowVisibility(sheet, 20);
} else {
// Keep old data if there is no data but the key wasn't changed
sheet.getRange("raw_data!A1").setValue(old_timestamp);
}
} else {
// Wipe everything if there is no key set and then set the initial IMPORTDATA function
sheet.getRange("raw_data!A1").offset(0, 0, 102, 300).clearContent();
sheet.getRange("raw_data!A1").setValue("=IMPORTDATA(CONCATENATE(\"https://data.wowaudit.com/shadowlands/\",KeyCode,\".csv\"))");
}
}
function UpdateRowVisibility(sheet, rows) {
// Update the amount of rows shown after the data has refreshed
if (rows < 20) { rows = 20; }
// First, show all rows
sheet.getSheetByName('Summary').showRows(1, 110);
sheet.getSheetByName('Overview & Rankings').showRows(1, 102);
sheet.getSheetByName('Great Vault & Gear').showRows(1, 102);
sheet.getSheetByName('Raids').showRows(1, 105);
// Then, hide unnecessary rows
sheet.getSheetByName('Summary').hideRows(8 + rows, 101 - rows);
sheet.getSheetByName('Overview & Rankings').hideRows(2 + rows, 101 - rows);
sheet.getSheetByName('Great Vault & Gear').hideRows(2 + rows, 101 - rows);
sheet.getSheetByName('Raids').hideRows(4 + rows, 101 - rows);
}
function CreateTrigger() {
// First delete old triggers
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
ScriptApp.deleteTrigger(allTriggers[i]);
}
// Then create new triggers
sheet = SpreadsheetApp.getActiveSpreadsheet();
var interval = sheet.getRange("RefreshSetting").getValue().slice(0,2);
ScriptApp.newTrigger("Fetch").timeBased().everyMinutes(interval).create();
ScriptApp.newTrigger("Refresh").forSpreadsheet(sheet).onEdit().create();
// Then give user feedback of success
if (ScriptApp.getProjectTriggers().length == 2) {
sheet.getRange('Settings!B9').setValue('The sheet is automatically refreshing!');
sheet.getRange('Settings!B9').setBackground('#b6d7a8');
sheet.getRange('Settings!B6').setValue('');
} else {
sheet.getRange('Settings!B9').setValue('Click here to start automatic refreshing!');
sheet.getRange('Settings!B9').setBackground('#ea9999');
sheet.getRange('Settings!B6').setValue('=IF(Guild="","",SetupIncompleteWarning)');
}
// Finally, refresh the sheet to replace the initial IMPORTDATA function
Fetch();
}