-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathautomatereporting.js
More file actions
118 lines (95 loc) · 4.3 KB
/
Copy pathautomatereporting.js
File metadata and controls
118 lines (95 loc) · 4.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
function fetchBigQueryData() {
var projectId = 'YOURPROJECTHERE';
var query = 'SELECT unique_key,CAST(created_date AS DATE) AS created_date, status, status_notes, agency_name, category, complaint_type, source FROM `bigquery-public-data.san_francisco_311.311_service_requests` Where extract(year from created_date) = 2024 LIMIT 100;'
//'SELECT * FROM `bigquery-public-data.san_francisco_311.311_service_requests` where agency_name = "Muni Feedback Received Queue" LIMIT 100';
var request = {
query: query,
useLegacySql: false
};
var queryResults = BigQuery.Jobs.query(request, projectId);
var jobId = queryResults.jobReference.jobId;
var results = BigQuery.Jobs.getQueryResults(projectId, jobId);
var rows = results.rows;
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('RawData');
if (!sheet) {
sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('RawData');
} else {
sheet.clear();
}
// Set headers
var headers = results.schema.fields.map(field => field.name);
sheet.appendRow(headers);
var headerRange = sheet.getRange(1, 1, 1, headers.length);
headerRange.setBackground('#000000').setFontColor('#FFFFFF').setFontWeight('bold');
// Set Rows
for (var i = 0; i < rows.length; i++) {
var row = rows[i].f.map(cell => cell.v);
sheet.appendRow(row);
}
}
function formatReport() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var rawSheet = ss.getSheetByName('RawData');
var reportSheet = ss.getSheetByName('Report') || ss.insertSheet('Report');
reportSheet.clear();
var rawData = rawSheet.getDataRange().getValues();
// Adding KPI boxes
var data = rawData.slice(1);
var totalRequests = data.length;
var closedRequests = data.filter(row => row[2] === 'Closed').length;
var openRequests = totalRequests - closedRequests;
// Adding KPIs with professional styling
var kpiHeaders = [['Report Metrics']];
var kpis = [
['Total Requests', totalRequests],
['Closed Requests', closedRequests],
['Open Requests', openRequests]
];
// Append KPI headers
reportSheet.getRange(1, 1, 1, 1).setValues(kpiHeaders);
var headerRange = reportSheet.getRange(1, 1, 1, 1);
headerRange.setBackground('#26428b').setFontColor('#FFFFFF').setFontWeight('bold').setFontSize(14);
headerRange.mergeAcross();
// Append KPI values
reportSheet.getRange(2, 1, kpis.length, 2).setValues(kpis);
var kpiRange = reportSheet.getRange(2, 1, kpis.length, 2);
kpiRange.setBackground('#f1f1f1').setFontColor('#000000').setFontWeight('bold').setFontSize(12);
// Adding some space before the table
reportSheet.appendRow([' ']);
// Add data refreshed timestamp
reportSheet.appendRow(['']);
var timestamp = new Date();
reportSheet.appendRow(['Data refreshed on:', timestamp]);
var timestampRange = reportSheet.getRange(reportSheet.getLastRow(), 1, 1, 2);
timestampRange.setBackground('#f1f1f1').setFontColor('#000000').setFontWeight('bold');
reportSheet.appendRow(['Open Requests']);
// Filter specific columns to include in the detailed table
// Specify the columns you want to include by their indices
// Filter rows based on a specific column value (e.g., only open requests)
var filteredRows = data.filter(row => row[2] === 'Open');
// Specify the columns you want to include by their indices
var columnsToInclude = [1, 2, 4, 5, 6];
var filteredHeaders = columnsToInclude.map(index => rawData[0][index]);
var filteredData = filteredRows.map(row => columnsToInclude.map(index => row[index]));
// Append filtered data headers and rows
reportSheet.appendRow(filteredHeaders);
reportSheet.getRange(reportSheet.getLastRow() + 1, 1, filteredData.length, filteredData[0].length).setValues(filteredData);
// Styling the detailed report header
var detailHeaderRange = reportSheet.getRange(reportSheet.getLastRow() - filteredData.length - 1, 1, 1, filteredData[0].length);
detailHeaderRange.setBackground('#26428b').setFontColor('#FFFFFF').setFontWeight('bold');
// Delete "Sheet1" if it exists
var sheetToDelete = ss.getSheetByName('Sheet1');
if (sheetToDelete) {
ss.deleteSheet(sheetToDelete);
}
}
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Custom Menu')
.addItem('Refresh Data', 'generateReport')
.addToUi();
}
function generateReport() {
fetchBigQueryData();
formatReport();
}