【问题标题】:Import XML content from a cell – Google spreadsheets从单元格导入 XML 内容 - Google 电子表格
【发布时间】:2021-04-12 06:29:36
【问题描述】:

我有一个我自己无法解决的问题 :( 我有一个电子表格,它的 A1 内容是

<?xml version='1.0' encoding='UTF-8'?>
<tsResponse xmlns="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableau.com/api http://tableau.com/api/ts-api-3.11.xsd">
    <pagination pageNumber="1" pageSize="100" totalAvailable="1"/>
    <views>
        <view id="96006974-18a1-4f65-8372-702fb964d36a" name="Obesity" contentUrl="Regional/sheets/Obesity" createdAt="2021-04-09T13:41:13Z" updatedAt="2021-04-09T13:41:13Z" viewUrlName="Obesity">
            <workbook id="1b66b892-fb08-4639-9d97-8561a3d63f9b"/>
            <owner id="528e5efa-e928-4341-bd59-8c0790227c67"/>
            <project id="ca5b55fa-9094-4543-a92c-64608028143f"/>
            <tags/>
        </view>
    </views>
</tsResponse>

我需要解析它并获得/view的id

所以我设法通过上传文件并从https://earthy-cows.surge.sh/tableau_response.xml 使用它来获取所有id,但是:

  1. 我无法从 A1 单元格值中执行 IMPORTXML 内容。可能吗?找不到任何信息
  2. 如何更改仅从 /view 获取 ID?为了获得所有 ID,我使用 =IMPORTXML("https://earthy-cows.surge.sh/tableau_response.xml","//@id")//view/@id" 因为 Xpath 不起作用。此外,从单元格导入也无法再次使用(请参阅问题 #1)

非常感谢!

【问题讨论】:

    标签: xml google-apps-script xpath google-sheets google-sheets-formula


    【解决方案1】:

    问题 1 的答案:

    我无法从 A1 单元格值中执行 IMPORTXML 内容。可能吗?找不到任何信息

    解决方法 1:

    IMPORTXML 从外部检索 XML 数据。因此,例如,当使用 Web 应用程序时,可以使用 IMPORTXML 和 xpath 检索值。 Ref针对你的情况,示例脚本如下。

    1。示例脚本。

    请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中。

    const doGet = e => ContentService.createTextOutput(e.parameter.data).setMimeType(ContentService.MimeType.XML);
    

    2。部署 Web 应用程序。

    详细信息可见the official document

    1. 在脚本编辑器上,在脚本编辑器的右上角,请点击“点击部署”->“新建部署”。
    2. 请点击“选择类型”->“Web App”。
    3. 请在“部署配置”下的字段中输入有关Web App的信息。
    4. 请为“执行为”选择“我”
      • 这是此解决方法的重点。
    5. 请为“谁有权”选择“任何人”
      • 在这种情况下,用户不需要使用访问令牌。因此,请将此用作测试用例。在你的情况下,我认为这个设置是合适的。
    6. 请点击“部署”按钮。
    7. 复制 Web App 的 URL。就像https://script.google.com/macros/s/###/exec

    3。测试。

    作为此 Web Apps 的测试,请将以下公式放入单元格中。在这种情况下,请将https://script.google.com/macros/s/###/exec 替换为您的网址。而且,单元格“A1”包含您的 XML 数据。 xpath 来自以下“问题 2 的答案”。

    =IMPORTXML(CONCATENATE("https://script.google.com/macros/s/###/exec?data=",A1),"//*[local-name()='view']//*/@id")
    

    解决方法 2:

    在您的情况下使用 Web 应用程序时,将从单元格中检索 XML 数据。在这种情况下,“URL Fetch URL 长度”有 2 KB 的限制。 Ref我担心你的实际情况有这个限制。在这种情况下,作为实现您目标的另一种解决方法,我想建议使用由 Google Apps Script 创建的自定义函数。使用自定义函数时,可以使用 XmlService 检索值。示例脚本如下。

    示例脚本:

    请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中,并保存。

    function SAMPLE(xml) {
      const root = XmlService.parse(xml).getRootElement();
      const ns = root.getNamespace();
      return root.getChild("views", ns).getChild("view", ns).getChildren().reduce((ar, e) => {
        const id = e.getAttribute("id");
        if (id) ar.push(id.getValue());
        return ar;
      }, []);
    }
    
    • 使用此脚本时,请将=SAMPLE(A1)的自定义公式放入单元格中。
    • 在此解决方法中,当您要检索其他值时,请修改脚本。

    结果:

    使用上述脚本时,得到如下结果。

    问题 2 的答案:

    如何更改仅从 /view 获取 id?要获取所有 ID,我使用 =IMPORTXML("https://earthy-cows.surge.sh/tableau_response.xml","//@id") 但 //view/@id" 因为 Xpath 不起作用。还有它不再适用于从单元格导入(请参阅问题 #1)

    在这种情况下,将xpath修改为//*[local-name()='view']//*/@id怎么样?当你的公式修改后,变成如下。

    修改公式:

    =IMPORTXML("https://earthy-cows.surge.sh/tableau_response.xml","//*[local-name()='view']//*/@id")
    

    结果:

    当使用上述公式时,得到以下结果。

    参考资料:

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多