3

我正在创建一些速记 js 变量,这些变量最终将合并到父级中以创建一些 XML。我的速记js在这里做错了什么?我有点失落。

我想出了这个简短的例子来概述我的问题:

function testing() {
  var attachments = [];

  var attachment1 = [ "attachment" ,
                     [ "name", "myname1" ],
                     [ "type", "mytype1" ]
                    ];
  attachments.push(attachment1);
  var attachment2 = [ "attachment" ,
                     [ "name", "myname2" ],
                     [ "type", "mytype2" ]
                    ];
  attachments.push(attachment2);

  var email = [ "email",
               [ "subject", "mySubject"],
               [ "body", "myBody"],
               [ "attachments", attachments ]
              ];
  Logger.log(Xml.parseJS(email).toXmlString());
}

日志输出:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<email>
    <subject>mySubject</subject>
    <body>myBody</body>
    <attachments>[Ljava.lang.Object;@b06f679</attachments>
</email>

理想情况下,它应该是:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<email>
    <subject>mySubject</subject>
    <body>myBody</body>
    <attachments>
        <attachment>
            <name>myname1</name>
            <type>mytype1</type>
        </attachment>
        <attachment>
            <name>myname2</name>
            <type>mytype2</type>
        </attachment>
    </attachments>
</email>
4

3 回答 3

2

您正在将数组放入数组中。

var attachment1 = [ "attachment" ,
                   [ "name", "myname1" ],
                   [ "type", "mytype1" ]
                  ];

var attachment2 = [ "attachment" ,
                   [ "name", "myname2" ],
                   [ "type", "mytype2" ]
                  ];


var email = [ "email",
             [ "subject", "mySubject"],
             [ "body", "myBody"],
             [ "attachments"]
            ];
email[3].push(attachment1);
email[3].push(attachment2);

You can use console.log(email) to see the different in the structures the web browser

This will also the same thing is more readable

attachments = ["attachments"];
attachments.push(attachment1);
attachments.push(attachment2);
var email = [ "email",
              [ "subject", "mySubject"],
              [ "body", "myBody"],
              attachments
            ];
于 2012-09-30T22:07:46.243 回答
1

错误在这一行:

[ "attachments", attachments ]

这有效地做的是:

[ "attachments", [ [attachment1], [attachment2] ] ]

而正确的应该是:

[ "attachments", [attachment1], [attachment2] ] 

一种解决方案是:

var email = [ "email",
              [ "subject", "mySubject"],
              [ "body", "myBody"],
              [ "attachments", attachment1, attachment2 ]   //<-- The attachment row must have two childs not one. 
            ];

或者,您可以按如下方式初始化附件数组:

var attachments = ['attachments']

然后按照上面的测试代码推送附件。最后,电子邮件将是:

var email = [ "email",
              [ "subject", "mySubject"],
              [ "body", "myBody"],
              attachments
            ];
于 2012-09-29T00:24:36.693 回答
0

我建议使用E4X 扩展在 GAS 中创建 XML。这是一个例子。bothgetOrgXMLcreateXMLFromCode函数创建相同的 XML 字符串。

function getOrgXML() {
  var xml = <email>
    <subject>mySubject</subject>
    <body>myBody</body>
    <attachments>
        <attachment>
            <name>myname1</name>
            <type>mytype1</type>
        </attachment>
        <attachment>
            <name>myname2</name>
            <type>mytype2</type>
        </attachment>
    </attachments>
  </email>;
  return xml;
}

function createXMLFromCode() {
  var attachment = <attachment/>;
  attachment.name = '';
  attachment.type = '';
  var email = <email/>;
  email.subject = 'mySubject';
  email.body = 'myBody';
  email.attachments = <attachments/>;
  var attach1 = attachment.copy();
  attach1.name = 'myname1';
  attach1.type = 'mytype1';
  var attach2 = attachment.copy();
  attach2.name = 'myname2';
  attach2.type = 'mytype2';
  email.attachments.appendChild(attach1);
  email.attachments.appendChild(attach2);
  return email;
}

function testXML() {
  var areEqual = getOrgXML().toXMLString() == createXMLFromCode().toXMLString();
  return areEqual;
}
于 2012-09-30T08:31:09.990 回答