创建哈希数组中的谷歌Apps脚本(Creating hash array in Google App

2019-08-01 00:42发布

我一直试图在本周使用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
 }

Answer 1:

阅读的问题,我理解的是,作者需要知道如何创建一个关联数组中的气体。 如果它是正确的,那么这里有一个链接夫妇( 这里和这里 )和代码示例是波纹管。

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



Answer 2:

我知道这是旧的文章/问题,但我想更新我的答案,因为原来前面回答(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. 
}

如果你喜欢使用数字索引数组一个临时的,你可以返回“临时”回呼叫单元。



Answer 3:

总结:对于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展示这种奇怪的行为。



文章来源: Creating hash array in Google Apps Script