[英]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.