Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在GoogleApps脚本中创建哈希数组_Javascript_Arrays_Hash_Google Apps Script_Trello - Fatal编程技术网

Javascript 在GoogleApps脚本中创建哈希数组

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

本周我一直在尝试使用Trello和Google应用程序脚本。我正在尝试创建一个哈希数组,然后用它加载电子表格。GoogleApps脚本不喜欢创建哈希的典型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
 }
函数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;i阅读这个问题,我明白作者需要知道如何在气体中创建。如果它是正确的,那么这里有几个链接(和),下面是一个示例代码

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;
    }
    
    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服务器提供)获取而可用