/** * @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(); }