簡體   English   中英

在Google Apps腳本中創建哈希數組

[英]Creating hash array in Google Apps Script

本周我一直在嘗試使用Trello和Google Apps腳本。 我正在嘗試創建一個哈希數組,然后我可以使用它來加載電子表格。 Google應用腳本不喜歡創建哈希的典型JavaScript代碼。 我查了一下文檔,但是他們沒有像哈希那樣的東西......他們對:

 var object = [];
 var object1 = {};
 object.push(object1);

這不會起作用,因為我基本上試圖做類似的事情:

var hash={name: , label: };
var n= someNumber;
var l= someLabel
var hash.push(name: n, label: l);

基本上這就是我現在的代碼。 但這是我的整個功能:

  function getData(){
  var list={};
  //get the list of delivered cards from Trello
  var listRequest = authorizeToTrello(); // get authorization
  var result = UrlFetchApp.fetch("https://trello.com/1/lists/4fea3a2c3a7038911ebff2d8/cards",
  listRequest);//fetch list
  var listOfCards = Utilities.jsonParse(result.getContentText());//Google app utility format json

  //outer loop to iterate through list of Cards
  for(var i=0; i < listOfCards.length; i++){
     var cardId = listOfCards[i].id; //get the id of a single card
     var l = listOfCards[i]["label"]; //get the label for the our structure

  //get a json object for a single card within the list of cards iteration 
  var cardRequest = authorizeToTrello();
  var getCard = UrlFetchApp.fetch("https://trello.com/1/cards/" + cardId + "/actions", cardRequest); 
  var singleCard = Utilities.jsonParse(getCard.getContentText());

 //inner loop to iterate the single cards JSON objects

  for(var j=0; j < singleCard.length; j++) {
    if(singleCard[j].data != undefined && singleCard[j].data.listAfter != undefined)
    {
      var str = singleCard[j]["data"]["listAfter"]['name'];
      if(str === "Delivered Q3 2012"){
          var n = singleCard[j]['memberCreator']['fullName'];
        }
     }
  }
    //push the data to list
    list.push(n,l);
  }

 return name, label; //return list for output
 }

閱讀這個問題,我理解作者需要知道如何在GAS中創建一個關聯數組 如果它是正確的,那么這里有幾個鏈接( 這里這里 ),下面是一個示例代碼。

function testMap() {
  var map = {};
  map["name1"] = "value1";
  map["name2"] = "value2";
  return map;
}

如果作者需要真的

一系列哈希

然后有幾種方法取決於需要哪種哈希算法。

  1. 使用Utilities.computeDigest方法使用可用算法之一計算字符串的哈希值。
  2. 如果Utilities.computeDigest不支持所需的哈希計算算法,則可以編寫自己的實現,因為它是為BLAKE函數 完成的。

以下是如何使用MD5哈希創建哈希數組的示例。

function testHash() {
  var array = [];
  array.push(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "value1"));
  array.push(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "value2"));
  return array;
}

PS作者代碼的返回行return name, label; //return list for output return name, label; //return list for output不正確 - 僅返回label變量值。 要返回幾個變量作為數組,必須寫return [name, label]; 或者可能是作者需要返回list變量而不是namelabel

我知道這是一個舊的帖子/問題,但我想更新我的答案,因為原來的答案(第一個答案)是誤導。 我本人正在尋找如何將關聯數組返回到電子表格中的單元格,但唉......“你不能”。 谷歌電子表格必須要一個數字索引的數組或一個對象。 否則返回“#ERROR”。

以下是復制問題的步驟。

function testMap() {
  var map = {};
  map["name1"] = "value1";
  map["name2"] = "value2";
  return map

Formula in your cell: =testMap()
Value in your cell: Thinking... #ERROR

解決方案(而不是解決方法)

1:使用for-each類型循環將關聯數組中的對象轉換為數字索引數組。

var temp = new Array();
for (var i in map) {
    temp.push([i,map[i]])
    // optionally use activeSheet.getRange(X:X).setValue([i,map[i]])) function here.
   // set values will not work in cell functions. To use it via cell functions, rerun / trigger the functions using an on_edit event. 
}

如果你使用像數字索引數組這樣的臨時數,你可以將“temp”返回給調用單元格。

簡介:對於onEdit() ,使用Cache Service來定義關聯數組數據。

這是一個共享的Gsheet,展示了這種奇怪的行為。 我嘗試了以下解決方案,以編程方式定義基於Google表格中數據的關聯數組。

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));
  },
};

要執行此操作,請在onOpen()事件處理程序中運行init()方法。

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

記錄器消息確認init()從工作表加載數據。

現在,如果我嘗試在onEdit()引用此assocArr對象,則返回所有鍵值的undefined

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

我推斷,出於安全原因,Google將簡單觸發器onEdit()為不具有全局變量范圍,就像它們取消了event.user屬性的效用event.user

現在,如果我只是將鍵值對放在緩存中,它就可以了! 以下是使用緩存服務工作的完整代碼。

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));
};

奇怪的是, onEdit()在其范圍內有cache變量。

這里再次展示了共同的Gsheet,展示了這種奇怪的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM