Creating hash array in Google Apps Script

后端 未结 3 445
再見小時候
再見小時候 2021-02-04 22:26

I\'ve been trying to work with Trello and the Google Apps Script this week. I am trying to create an array of hashes that I can then use to load the spreadsheet. Google apps s

3条回答
  •  野趣味
    野趣味 (楼主)
    2021-02-04 22:57

    Summary: For onEdit() purposes, use Cache Service to define associative array data.

    Here's a shared Gsheet demonstrating this curious behavior. I tried the following solution in programmatically defining an associative array based on data in a Google sheet.

    var assocArr = {
      labels: {},
      init: function () {
        var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheetName');
        var values = sheet.getDataRange().getValues();
        for(var row in values) {
          assocArr.labels[values[row][0]] = values[row][1];
        };
        for(var key in assocArr.labels) {
          Logger.log("key: %s, value: %s",key, assocArr.labels[key]);
        };
        return(void(0));
      },
    };
    

    To execute this, you run the init() method in the onOpen() event handler.

    function onOpen() {
      assocArr.init();
      var key = 'test';
      SpreadsheetApp.getUi().alert( assocArr.labels[key] );
      Logger.log("onOpen: key: %s, value: %s",key, assocArr.labels[key]);
    };
    

    The logger message confirms that init() loads the data from the worksheet.

    Now if I try to reference this assocArr object in onEdit() it returns undefined for all key values.

    function onEdit(event) {
      var key = 'test';
      SpreadsheetApp.getUi().alert( assocArr.labels[key] );
      Logger.log("onEdit: key: %s, value: %s",key, assocArr.labels[key]);
    };
    

    I infer that for security reasons, Google limited the simple-trigger onEdit() to not have global variable scope, same as they voided the utility of the event.user property.

    Now instead if I simply put the key-value pair in the cache, it works! Here is the complete code that works using the Cache Service.

    var cache = CacheService.getPrivateCache();
    
    var assocArr = {
      init: function () {
        var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Account Labels');
        var values = sheet.getDataRange().getValues();
        for(var row in values) {
          cache.put(values[row][0], values[row][1], 3600);
        };
        return(void(0));
      },
    };
    
    function onOpen() {
      assocArr.init();
      var key = 'test';
      SpreadsheetApp.getUi().alert( cache.get(key) );
      Logger.log("onOpen: key: %s, value: %s",key, cache.get(key));
    };
    
    
    function onEdit(event) {
      var key = 'test';
      SpreadsheetApp.getUi().alert( cache.get(key) );
      Logger.log("onEdit: key: %s, value: %s",key, cache.get(key));
    };
    

    Curiously, the onEdit() has the cache variable in its scope.

    Here again is the shared Gsheet demonstrating this curious behavior.

提交回复
热议问题