1

スプレッドシート コンテナにバインドされたスクリプトに dumpObject 関数を追加しようとしています。

理想的には、トリガーを介して渡される変数を可視化するためです。

Script Editor 内から 1 日中実行できますが、onEdit イベントまたは onEdit インストール可能トリガーとして設定すると、エラーなしで終了します。

試行錯誤のトースト メッセージを実行し、dumpObject のコードがトリガーから実行されていることを確認しました。

以下のコードを使用して、onEdit2 をインストール可能なトリガーとして設定すると、それが表示される場合があります。

トリガーとして機能することを確認するには、onEdit2 の最初の行 //e のコメントを外します。

私が把握できる最善の方法は、オブジェクトに期待されているものとはまったく異なるトリガーからの e オブジェクトの何かですか?

このテストでは maxDepth を 5 に制限する必要があるため、1000 の深さ制限に達しているとは思いません。

UPDATE : 問題は、トリガー オブジェクトのプロパティで typeof を呼び出すことです。たとえば、「typeof e.user」は次のエラーを報告します: タイプの JavaScript 値が無効です

ありがとう、ジム

function onEdit2(e) {
  //e = {fish:{a:"1",b:"2"},range:SpreadsheetApp.getActiveSpreadsheet().getActiveRange(),B:"2"};
  Browser.msgBox(typeof e);
  Browser.msgBox("U:" + Utilities.jsonStringify(e));
  e.range.setComment("Edited at: " + new Date().toTimeString());

  Browser.msgBox("ShowOBJ:"+dumpObject(e, 5));

}

function dumpObject(obj, maxDepth) {
  var dump = function(obj, name, depth, tab){
  if (depth > maxDepth) {
    return name + ' - Max depth\n';
  }

  if (typeof obj === 'object') {
    var child = null;
    var output = tab + name + '\n';
    tab += '\t';
    for(var item in obj){
      child = obj[item];
      if (typeof child === 'object') {
        output += dump(child, item, depth + 1, tab);
      } else {
        output += tab + item + ': ' + child + '\n';
      }
    }
   }
    return output;
  };
  return dump(obj, '', 0, '');
}
4

2 に答える 2

1

イベントオブジェクトから期待するものがまったく得られていません。投入した場合:

 for(var q in e) {
    Logger.log(q + " = " + e[q])   
 }

次に、表示されるスクリプトエディタの[表示]->[ログ]メニュー項目を確認します

source = Spreadsheet
user = <your user>

だから、ドキュメントをチェックして、あなたはあなたの代わりにこれを思い付くことができますe.range.setComment("Edited at: " + new Date().toTimeString());

e.source.getActiveSheet().getActiveCell().setComment("Edited at: " + new Date().toTimeString());

注:次のようにtry catchでステートメントをラップすることで、(密かに)取得したようなエラーをデバッグできます。

  try {
    e.range.setComment("Edited at: " + new Date().toTimeString());
  } catch (ex) {
    Logger.log(ex); 
  }

次に、上記のようにログをチェックします(またはBrowser.msgBox()、必要に応じて、にダンプします)。

于 2012-11-15T14:43:04.450 に答える
0

これは素晴らしい「答え」ではないかもしれませんが、うまくいきます。

typeof を Object.prototype.toString.call(obj) に置き換えると、使用可能なものが得られることがわかりました。

e オブジェクトは [object Object] を返しますが、プロパティ (e.user) は [object JavaObject] を返します。

if (Object.prototype.toString.call(obj).indexOf("object") != -1) {
  var child = null;
  var output = tab + name + '\n';
  tab += '\t';
  for(var item in obj){
    child = obj[item];
    if (Object.prototype.toString.call(child).indexOf("object") != -1) {
      output += dump(child, item, depth + 1, tab);
于 2012-11-15T17:21:42.807 に答える