I have done a ton of searching for this problem and I think the issue is all the answers result in a solution that requires you to create a library. Then, the only way I see to add that library to a spreadsheet is to create a new script for that spreadsheet and include it.
What I want: A bunch of spreadsheets that all include one master script. Each time the script is updated, they all update to use the latest script.
What I have: 15 spreadsheets that all have copies of the original script. The original script has changed and now it would appear I have to go edit each script called
Copy of myScriptName
that exists within each copied spreadsheet.What I did: I created the first spreadsheet and wrote the script from within a project I created in its script editor. Worked perfect. I then made 14 copies of that spreadsheet for each division of a company to use.
How can I just share the script and manage it outside of any of the individual spreadsheets themselves? I have to be missing something here considering all the people looking for this same answer. I just don't see how making it a library solves my use case.
Thanks!
I don't see what this will help, but per the comment's request here is the script:
function createRollupTable() {
//Return if:
// There is only the account code parameters passed in with no quarterly info
// If the length of the account code parameters passed is empty
if(arguments.length <= 1 || !arguments[0] || arguments[0].length <= 0) {
return "";
}
var rollupTable = new Array();
var fullListAccountCodes = arguments[0];
//The first column of output is the full list of account codes for all the quarters
rollupTable[0] = fullListAccountCodes;
//Array to keep the YTD total for each account code
var yearlyAccountCostOutput = new Array(fullListAccountCodes.length);
//Iterate over all the quarters that were passed in
for(var i=1;i<arguments.length;i++) {
//This array should be set to the total length of the available account codes
var quarterlyRollupCostOutput = new Array(fullListAccountCodes.length);
var quarterlyBreakdown = arguments[i];
var quarterIndexCounter = 0;
var quarterTotalCost = 0;
//Iterate over all the account codes
for(var j=0;j<fullListAccountCodes.length && quarterIndexCounter<quarterlyBreakdown.length;j++) {
//Find the one that matches the current account code for this quarter
if(fullListAccountCodes[j] == quarterlyBreakdown[quarterIndexCounter][0]) {
//Set the index of the output based on the full list so they align
quarterlyRollupCostOutput[j] = quarterlyBreakdown[quarterIndexCounter][1];
//Add this cost to the running total for the quarter
quarterTotalCost += quarterlyBreakdown[quarterIndexCounter][1];
//Add the total amount for the yearly rollup for that account code
if(yearlyAccountCostOutput[j]) {
yearlyAccountCostOutput[j] += quarterlyBreakdown[quarterIndexCounter][1];
} else {
yearlyAccountCostOutput[j] = quarterlyBreakdown[quarterIndexCounter][1];
}
//Increment the counter so we search for the next account code in the quarter
quarterIndexCounter++;
}
}
rollupTable[i] = quarterlyRollupCostOutput;
//Add a blank row in the results for spacing
rollupTable[i].push("");
//Add the quarterly total cost
rollupTable[i].push(quarterTotalCost);
}
//Add a blank row for spacing
rollupTable[0].push("");
//Google spreadsheet forces you to pad with non breaking spaces, no right align option available
var spaces = "";
var numSpaces = 66;
for(var i=0;i<numSpaces;i++){spaces+=String.fromCharCode(160);};
//Add a row for the Totals
rollupTable[0].push(spaces + "Totals:");
//Add the YTD column
rollupTable.push(yearlyAccountCostOutput);
return rollupTable;
}
To share a container-bound project, you simply share the parent container file. For example, if you have a script bound to a Google Sheet, you can make someone an editor of the script by making them an editor of the Google Sheet.
Google Apps Script projects are now included in the docs list in Google Drive. - Your projects are now stored in Google Drive and can be shared just like any other file.
Use the IMPORTRANGE function In Sheets, open a spreadsheet. In an empty cell, enter =IMPORTRANGE. The URL of the spreadsheet in Sheets. The sheet name (optional) and the range of cells to import.
Get data from other sheets in your spreadsheet Type = followed by the sheet name, an exclamation point, and the cell being copied. For example, =Sheet1! A1 or ='Sheet number two'! B4 .
Maybe what what you're asking for is just a way to copy exactly what's in a master script over to all of your scripts that are inside the spreadsheet copies so that it replaces their code and skips over the need to reference a library, but I'll offer my impression on how the library setup works...
the only way I see to add that library to a spreadsheet is to create a new script for that spreadsheet
When you make a copy of a spreadsheet that already has a script with a library reference, it'll stay in with the new copy. So, you shouldn't have to create any new scripts after you've created one spreadsheet template to copy.
That one spreadsheet template should have a library reference to the master script. The master doesn't need to be inside a sheet and you shouldn't be copying the original / master script.
So, we have: 1 master script, 1 spreadsheet template that has a script that references the master, then as many copies of the template as you want.
Now when you setup the library reference, you have the option to connect it in the spreadsheet template in dev mode. This will allow any changes to existing functions in the master script to instantly affect the template copies (unless authorization is first needed). If you have it this way, you will might want to test out your changes in a copy of the master script first. The other option is to keep dev mode turned off and have users of the template copies manually update their library version inside each of their scripts (unless there's an automatic version updating system I don't know about).
This setup still doesn't solve the issue of adding a completely new function to the master script that each template copy needs to reference though. Maybe some one can comment or provide a separate answer to that.
[Update: 3/15/2015] So publishing an Add-on to the Chrome Web store lets you install an Add-on once and have it appear in all your Sheets / Docs / Forms which I believe was what was originally needed for OP. Pushing new versions out updates all Google docs that use it.
https://developers.google.com/apps-script/add-ons/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With