-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrefreshdata.gs
136 lines (126 loc) · 3.81 KB
/
refreshdata.gs
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/**
* If there are more response lines than info lines. Add the missing formulae based on the 2nd row in Information (first row of data)
*/
function refreshData(){
if (checkPreferencesSet())
{
var lastResponse = getLastFormEntry();
var lastCalc = getLastInformationRow();
if (lastResponse > lastCalc){
var prefs = getPreferences();
var copiedRow = getRowFormulae(prefs['rowToCopy']);
for (var r = lastCalc; r < lastResponse; r++){
var infoSheet = activateSheet(prefs['targetSheet']);
var rowToChange = r + 1;
copiedRow.copyTo(infoSheet.getRange(rowToChange + ":" + rowToChange));
}
Browser.msgBox(lastResponse - lastCalc + " rows added.",Browser.Buttons.OK);
}
else{
Browser.msgBox("Nothing to refresh.",Browser.Buttons.OK);
}
}
else {
displayOptions();
Browser.msgBox("You must set the source sheet, target sheet, and row to copy.",Browser.Buttons.OK);
}
}
function getSheetNames(){
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
var sheetNames = new Array();
for (var s = 0; s < sheets.length; s++){
sheetNames[s] = sheets[s].getName();
}
return sheetNames;
}
/**
* Get the total number of form responses.
*/
function getLastFormEntry(){
var prefs = getPreferences();
var responseSheet = activateSheet(prefs['sourceSheet']);
return responseSheet.getLastRow();
}
/**
* Get the total number of calculation rows.
*/
function getLastInformationRow(){
var prefs = getPreferences();
var infoSheet = activateSheet(prefs['targetSheet']);
return infoSheet.getLastRow();
}
/**
* Copy the first row of formulae the Information sheet (to avoid possible manual amendments)
*/
function getRowFormulae(row) {
var prefs = getPreferences();
var infoSheet = activateSheet(prefs['targetSheet']);
var range = infoSheet.getRange(row + ":" + row );
return range;
}
/**
* Activate the sheet based on the argument string value
*/
function activateSheet(sheet){
var ss = SpreadsheetApp.getActiveSpreadsheet();
return ss.getSheetByName(sheet);
}
/**
* Function to add menu options for refreshing, and setting options.
*/
function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: 'Refresh calculations', functionName: 'refreshData'},
{name: 'Settings', functionName: 'displayOptions'}
];
spreadsheet.addMenu('Custom Options', menuItems);
}
/*
* Display the sidebar
*/
function displayOptions(){
var html = HtmlService.createTemplateFromFile('sidebar').evaluate()
.setSandboxMode(HtmlService.SandboxMode.IFRAME)
.setTitle('Form calculation Settings')
.setWidth(300);
SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
.showSidebar(html);
}
/*
* Return user's preferences for source and target spreadsheet
*/
function getPreferences() {
var userProperties = PropertiesService.getDocumentProperties();
var prefs = {
sourceSheet: userProperties.getProperty('sourceSheet'),
targetSheet: userProperties.getProperty('targetSheet'),
rowToCopy: userProperties.getProperty('rowToCopy'),
};
return prefs;
}
/*
* Set the user's preferences based on the function arguments
*/
function setPreferences(source,target,row) {
var userProperties = PropertiesService.getDocumentProperties();
userProperties.setProperty('sourceSheet', source);
userProperties.setProperty('targetSheet', target);
userProperties.setProperty('rowToCopy', row);
}
/*
* Returns true if all settings are set, otherwise false.
*/
function checkPreferencesSet() {
var valid = true;
var settings = Array('sourceSheet','targetSheet','rowToCopy');
var i = 0;
var props = PropertiesService.getDocumentProperties();
while (i < settings.length && valid) {
if (props.getProperty(settings[i]) == null) {
valid = false;
}
i++;
}
return valid;
}