我一直试图在本周使用Trello和谷歌Apps脚本工作。 我想创建哈希值,我就可以使用加载电子表格的数组。 谷歌Apps脚本不喜欢创建哈希的典型的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
}
阅读的问题,我理解的是,作者需要知道如何创建一个关联数组中的气体。 如果它是正确的,那么这里有一个链接夫妇( 这里和这里 )和代码示例是波纹管。
function testMap() {
var map = {};
map["name1"] = "value1";
map["name2"] = "value2";
return map;
}
如果作者确实需要
散列的阵列
然后有一对夫妇的取决于其散列算法需要研究如何。
- 使用Utilities.computeDigest方法来计算使用的一个字符串的哈希可获得的算法 。
- 如果所需的哈希计算算法不被支持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
变量,而不是name
和label
。
我知道这是旧的文章/问题,但我想更新我的答案,因为原来前面回答(1日回答)是一种误导。 我是我自己寻找如何在电子表格中返回关联数组回电池,但很可惜。“你不能”。 谷歌电子表格必须要一个数字索引的数组或对象。 否则返回“#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:传输从关联阵列的物体进入使用-每种类型的循环中的数字索引数组。
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.
}
如果你喜欢使用数字索引数组一个临时的,你可以返回“临时”回呼叫单元。
总结:对于onEdit()
的目的,使用缓存服务来定义关联数组数据。
这里的共享Gsheet展示这种奇怪的行为。 我试图在编程方式定义基于在谷歌片数据的关联数组下述溶液。
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));
},
};
要执行此操作,运行init()
的方法onOpen()
事件处理程序。
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()
从工作表中加载数据。
现在,如果我尝试在引用这assocArr对象onEdit()
返回undefined
所有键值。
function onEdit(event) {
var key = 'test';
SpreadsheetApp.getUi().alert( assocArr.labels[key] );
Logger.log("onEdit: key: %s, value: %s",key, assocArr.labels[key]);
};
我推断,出于安全考虑,谷歌限制了简单触发onEdit()
不具有全局变量的作用域,同他们作废了的效用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展示这种奇怪的行为。