[英]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;
}
如果作者需要真的
一系列哈希
然后有幾種方法取決於需要哪種哈希算法。
以下是如何使用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
變量而不是name
和label
。
我知道這是一個舊的帖子/問題,但我想更新我的答案,因為原來的答案(第一個答案)是誤導。 我本人正在尋找如何將關聯數組返回到電子表格中的單元格,但唉......“你不能”。 谷歌電子表格必須要一個數字索引的數組或一個對象。 否則返回“#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.