4

今週は、Trello と Google Apps Script を使って作業しようとしています。スプレッドシートの読み込みに使用できるハッシュの配列を作成しようとしています。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
 }
4

3 に答える 3

15

質問を読んで、著者はGASで連想配列を作成する方法を知る必要があることを理解しました。それが正しければ、いくつかのリンク (ここここ) とサンプル コードを以下に示します。

function testMap() {
  var map = {};
  map["name1"] = "value1";
  map["name2"] = "value2";
  return map;
}

作者が本当に必要なら

ハッシュの配列

次に、必要なハッシュアルゴリズムに応じていくつかの方法があります。

  1. Utilities.computeDigestメソッドを使用して、使用可能なアルゴリズムの 1 つを使用して文字列のハッシュを計算します。
  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 正しくありませんlabel。変数値のみが返されます。いくつかの変数を配列として返すには、 と書く必要がありますreturn [name, label];。または、作成者は and ではなく変数を返す必要があるかもしれませlistん。namelabel

于 2012-09-30T08:08:17.487 に答える
2

これは古い投稿/質問であることは知っていますが、元の回答(最初の回答)が誤解を招くため、回答を更新したいと思います。私自身、連想配列をスプレッドシートのセルに戻す方法を探していましたが、残念ながら..「できません」。Google スプレッドシートでは、数値でインデックス付けされた配列またはオブジェクトが必要である必要があります。それ以外の場合は、「#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" を呼び出し元のセルに返すことができます。

于 2013-05-10T22:26:49.770 に答える
1

概要: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));
  },
};

これを実行するには、イベント ハンドラー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]);
};

セキュリティ上の理由から、Google は simple-triggeronEdit()にグローバル変数のスコープを持たないように制限したと推測します。これは、プロパティの有用性を無効にしたのと同じ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を示します。

于 2014-08-26T16:09:13.513 に答える