GAS Library App  :: Intro  ➲  Model  ➲  Start  ➲  FAQ

 For further questions please contact : support@iboapp.info.

What's the use of LibraryApp in general?

As you know, GAS may be slow and sometimes instable, yet it is a powerful tool because the Google Apps platform supports a more effective kind of collaboration. Google Apps and Google Apps Script require a paradigm shift because most organizations got used to traditional ways of cooperation and joint ventures.

LibraryApp is a utility for managing multiple GAS projects with many libraries and developers.  It has been published in order to proof that our process for the migration of working prototypes into reliable products will work.

As a GAS developer you may contribute to improve the LibraryApp. By doing so you would qualify for an assessment. If you would pass the assessment, you could be invited to join the IBO Apps development team.

In case Google Drive (client) would not reach the server, a GAS repository may help as well. When the information needed to finish your though process is organised using the GAS repository you will still have access to the library by clicking the link. You may still have to delete the cache of the browser afterwards for regaining access via Google Drive. 

How to start?

Start and authorise the "GAS Library Management" App. The next dialog invites you to edit your "LibraryApp.projects" (open source) .  Include your libraries and run the "START_Monitoring" function, i.e. start the monitor trigger and watch your inbox for instructions. Follow the step by step instructions sent to your inbox.

Even if you do not purchase the web app, you are able to use the basic monitoring function for free

Make sure to add the library id manually in case it could not be found automatically! 
You will have to add categoryName and id.

Gmail accounts do not own the domain, is there a workaround?

Yes. The repository site is created manually. Open your inbox after "START_Monitoring" and follow the instructions. Use your user name (normalised) and add 'source', e.g. nnillixxsource.

Where to include additonal info on pages?

Make sure to position them behind "<DIV><BR>" otherwise a change in the list of libraries used by the library will remove e.g. your drawing or text.

How to Update LibraryApp library and/or LibrayApp.projects code?

If a new version of LibraryApp is published:
  1. Edit your "LibraryApp.projects" library.

  2. Update the included "LibraryApp" library to version xy. (see Using a library)
If the implementation of the projects library has been improved, you will have to exchange the source:
  1. Run "STOP_Monitoring"

  2. Edit the public "LibraryApp.projects" template

  3. Copy the source from the "code.gs" file

  4. Edit your "LibraryApp.projects" library

  5. Paste the code and overwrite the current implementation CHECK for the above!

  6. Run "START_Monitoring"

  7. Run the Web App again  (see Start)

Pulic library not extracted completely?

If the library is not owned by you, the monitoring result depends on the version that has been published. If necessary copy the code of the original or contact the author for an updated version.

Monitoring of HTML?

HTML services behave different than Java Script.  This may result in unexpected behaviour in some cases. If projects contain html files, these files can not be monitored yet.

Extracting local, hidden or private functions?

Private functions are encapsulated into the library, i.e. not visible outside. In order to "cross the border" one has to transfer the implementation into user properties for external processing. Use the following function to extract local functions.

function LibraryApp_getPrivateFunctions () {
  // Unique ID = App x project x key
  // How to get the project name from within the project source?
  // EDIT THIS CODE AND CHANGE the VALUE of "project" INTO THE NAME OF YOUR LIBRARY
  var project = 'LibraryApp'; 
  var keys = '';
  var seperator = '';
  // Internal call provides access, external call prohibites access
  // The source will be available to LibraryApp if stored in user properties
  // Running this function may result in a persistent object
  for (var key in this) {
    if (key[key.length-1]=='_') { // each private or local function
      keys = keys+seperator+key;
      seperator = ';';
      UserProperties.setProperty('LibraryApp'+project+key, this[key]); 
      Utilities.sleep(1000);    
    }
  }
  if (keys) { // list of all keys
    UserProperties.setProperty('LibraryApp'+project+'__META__KEYS__', keys);
    Utilities.sleep(1000);
  }
} // LibraryApp_getPrivateFunctions

Are libraries detected if they are used but not registered?

If a library is used by a library that is registered in the "LibraryApp.projects" library, than search will provide a link to the library in case it can be found on Google Drive. This link will be sent to your inbox with a reminder to register the missing library. Registration is a manual procedure. 

Changes in the use of libraries can only be detected via "LibraryApp.keys". Contact support in case you need automatic detection.

The default name of master site, 'source', is in use?

The default is "source", in case this is in conflict with one of your sites, contact support.

Unexpected Errors?

Make sure the included libraries are all functioning and declarations are complete and valid. 

Backup does not save the source code?

If you are not the owner of the library i.e. the libray is shared in public, backup will not work, just monitoring will work. Unless the owner of the library has included the "getCode" function into the library.

Further authorization required?

In case a library is added that requires further authorization switch on immediate notification on error for the "LibaryApp_MONITOR" trigger.

Functions derived by multiple libraries? LIMITATION!

The same function can be derived, e.g. overloaded, in many libraries, but for now only one of the derivatives can be extracted. Backup will cover all of them.

What happens if the library is renamed?

They can be renamed on various occasions, but monitoring will deliver new pages in the source site if the name is change!

Depreciation of whole libraries?

A whole library should be depreciated manually after removing it from the projects library file, i.e. either marked as depreciated or deleted from the source site.

"Exceeded maximum execution time"?

Processing many functions and changes may result in this error, but it should not result in permanent failure! The library may just require additional cycles to be processed in full. 

Are category and file names mandatory?

Yes! A category and a name for the script library file must be provided.

No notification on changes despite subscription?

Only manual changes result in notifications. Changes due to GAS site services do not result in notifications, a future release of the LibraryApp could provide notifications. Contact support@iboapp.info in case these notifications are required for your project. Make sure your subscription is for the whole site and not just for a single page ( see Get notified when a site or page changes)

Does monitoring tell who is responsible for a change?

There is no monitoring of users, just source. If the Googl GAS developer team would enhance the source editor, e.g. provide a GAS service for it, the API should provide a function for tracking changes by user.

Does it run on Android devices?

Server based solutions are not really bound to devices. But until Google Chrome Webstore is available on Android too, you will have to use a Google Chrome browser on a PC, Mac or Chrome Book in order to purchase the app. As soon as you have purchased the App you will have access to the payed features as well.

Chrome Web Store service not activated?

If you are not using a free mail account but a Google Apps account you may activate access to the Chrome web store for your account first or request your administrator to do so for you.

What does "Script" mean?

In computer programming, a script is a program or sequence of instructions that is interpreted or carried out by another program rather than by the computer processor (like a compiled program is). ( see Scripting Language)

Depreciated!

How to handle "TypeError" message?

The following code was masked in the samples of Serge Gabet to get them extracted with the App. But this is only applicable for demo purposes. 

/* 
TypeError: Methode "getSheetByName" von null kann nicht aufgerufen werden. (Zeile 6, Datei "Tracker", Projekt "Calendar tracker")

  var nom = String(Session.getUser().getUserLoginId());
  var authorized = ['admin','webmaster','mary','william'];// define a list of 'authorized event creators'
  var owner = 'mail@xxx.yyy';// email to whom the email will be sent
  var collaborator = 'a collaborator email';// email of an additional collaborator (optional, see line 93)
  var ss = SpreadsheetApp.getActiveSpreadsheet();// this spreadsheet
  var sh = ss.getSheetByName('master');
  var calList = sh.getDataRange().getValues();
  var logsheet = ss.getSheetByName('logger');
  var last = logsheet.getLastRow();
  var FUS1=new Date().toString().substr(25,6)+":00";
*/

For real projects consider : Replace global declaration by encapsuled local declaration. 

Extracting code?

Everyone who wants his library functions to be extracted without payment could include the following function into his library. The extraction will not be complete, e.g. global var declarations and comments get lost. Consider a subscription in case automatic backup of the full source code is important to you. 

function getCode(libraryCodeObject) {
    try {
        var hint = "Insert the names of script files in the sample \"keys\" array";
        var keys = ["code", "copyright", "readme", "todo", "draft"].concat(Object.keys(this)); 
                         // adopt to the file names in your project if they differ from the function name
        var code = "";
        for (var i in keys) {
            var scriptFileName = keys[i];
            try {
                code = code + ScriptApp.getResource(scriptFileName).getDataAsString() + "\n\n";
            }
            catch (e) {
            }
        }
        return code;
    }
    catch (e) {
        throw "LibraryApp.getCode: \n" + e + "\n stack: \n" + e.stack;
    }
}