Javascript 在GoogleApps脚本中创建哈希数组
本周我一直在尝试使用Trello和Google应用程序脚本。我正在尝试创建一个哈希数组,然后用它加载电子表格。GoogleApps脚本不喜欢创建哈希的典型javascript代码。我查阅了文档,但它们没有类似哈希的内容……它们说:Javascript 在GoogleApps脚本中创建哈希数组,javascript,arrays,hash,google-apps-script,trello,Javascript,Arrays,Hash,Google Apps Script,Trello,本周我一直在尝试使用Trello和Google应用程序脚本。我正在尝试创建一个哈希数组,然后用它加载电子表格。GoogleApps脚本不喜欢创建哈希的典型javascript代码。我查阅了文档,但它们没有类似哈希的内容……它们说: var object = []; var object1 = {}; object.push(object1); 这是行不通的,因为我基本上是想做一些事情,比如: var hash={name: , label: }; var n= someNumber; v
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
}
函数getData(){
var list={};
//从Trello处获取已发送卡片的列表
var listRequest=authorizeToTrello();//获取授权
var result=UrlFetchApp.fetch(“https://trello.com/1/lists/4fea3a2c3a7038911ebff2d8/cards",
listRequest);//获取列表
var listOfCards=Utilities.jsonParse(result.getContentText());//谷歌应用实用程序格式json
//循环遍历卡片列表的外部循环
for(var i=0;ifunction testMap() {
var map = {};
map["name1"] = "value1";
map["name2"] = "value2";
return map;
}
如果作者真的需要
散列数组
然后,根据所需的哈希算法,有两种方法
function testHash() {
var array = [];
array.push(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "value1"));
array.push(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "value2"));
return array;
}
p.S.作者代码的返回行返回姓名、标签//输出的返回列表
不正确-仅返回标签
变量值。要将两个变量作为数组返回,需要编写return[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的数字索引数组,则可以将“temp”返回给调用单元 摘要:出于onEdit()
目的,请使用缓存服务定义关联数组数据。
这里展示了这种奇怪的行为。我尝试了以下解决方案,根据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()
中引用这个assocar对象,它将返回所有键值的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
属性的实用程序一样
现在,如果我只是将键值对放在缓存中,它就可以工作了!下面是使用缓存服务的完整代码
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
变量
这里再次展示了这种奇怪的行为。“我推断,出于安全原因,谷歌限制了简单触发器onEdit()不具有全局变量范围”-我认为这是一个错误的解释。GAS脚本在触发(onOpen、OneEdit等)时从零开始在服务器上执行,这意味着您定义的任何变量的生命周期都只有一个服务器执行(即,只有一个触发器)。这就是为什么变量“assocar”(或者说,您声明的任何全局变量)不能跨触发器使用的原因。此外,缓存仅因从CacheService(由GAS服务器提供)获取而可用