【问题标题】:How do I create a dynamic file path for Power Query for a file coming from SharePoint?如何为来自 SharePoint 的文件创建 Power Query 的动态文件路径?
【发布时间】:2022-08-08 20:39:58
【问题描述】:

背景:我最近接受了一份新工作,我正在培训我的替代者。我为公司建立了很多报告,其中大部分已保存到我的 OneDrive。我一直在将这些文件移动到受训人员可以使用的 SharePoint 网站,这要求我修复报告中的电源查询,以便当她刷新工作簿中的链接时,它会从另一个工作簿中提取数据相同的共享点。

问题:我正在使用 SharePoint 的“添加 OneDrive 的快捷方式”功能,因此我可以从我的文件资源管理器中访问文件,所以当我去选择文件时,它会根据我的用户名构建一个路径,从而阻止她由于文件路径不可访问,因此能够刷新工作簿。

我已采取的步骤:我阅读了这篇文章https://excel.tv/how-to-create-a-relative-file-path-in-power-query/,我认为这将我带向了正确的方向,除了它从位于硬盘驱动器上的所有文件的角度来看,而不是从 SharePoint 网站。当我将此公式输入到我在 SharePoint 上共享的文件中时:

=LEFT(CELL(“filename”,$A$1),FIND(“[“,CELL(“filename”,$A$1),1)-1)

它不是返回包含我的用户名的文件路径,而是返回一个 https 链接(例如https://sharepoint.com/teams/SharedHub),然后电源查询会调用错误,因为它不是有效的绝对路径。此外,作为参考,这里是高级编辑器中的代码块。

let
Filepath = Excel.CurrentWorkbook(){[Name=\"Filepath\"]}[Content]{0}[Column1],
Source = Excel.Workbook(File.Contents(Filepath & \"The SharePoint File.xlsx\"), null, true),
tbl_nexidia_Table = Source{[Item=\"tbl\",Kind=\"Table\"]}[Data]
in
    tbl_Table

我还尝试使用 Get data --> From File --> From SharePoint Folder 构建一个新查询,但这似乎从 SharePoint 中提取了所有文件夹名称,我还没有弄清楚如何深入到特定工作簿从特定表中获取数据。

非常感谢这方面的一些帮助!

  • 我肯定会监视这篇文章,看看会出现什么解决方案。我从未设法让 PQ 接受 SharePoint 文件的动态文件路径,因此我倾向于运行一些 VBA 来确定当前用户名并动态构建等效的本地路径。也就是说,我的版本中没有“来自文件/来自 SharePoint 文件夹”选项 - 我一直认为这可以解决我的问题。您确定无法使用该选项过滤结果吗?
  • 不幸的是,除了定位 Excel 工作簿并从该工作簿中选择一个表并对其应用某些筛选器之外,我对 Power Query 的经验并不丰富。当我选择“来自 SharePoint 文件夹”选项时,它要求您放置 SharePoint 网站的根链接而不是特定位置,然后当它在 Power Query 中加载时,它只显示来自该 SharePoint 的所有文件的列表.我尝试过滤我需要的文件,但我不知道如何让它专门从中提取一些东西:-/

标签: excel sharepoint powerquery filepath


【解决方案1】:

Power Query 的本机文件有一个 SharePoint 连接器,它不会使用您的用户名。

https://docs.microsoft.com/en-us/power-query/connectors/sharepointfolder

旁注,您不能使用 CELL 函数,因为

  • 在旧版 Excel 中,用户可能需要按 CTRL+ALT+F9 来使用他们的用户名更新计算,用户会讨厌它。
  • 在 O365 Excel 中,如果文件存储在 SP 中,则返回文件 url。因此,您最终也将使用上面的 SharePoint 连接器。

【讨论】:

    【解决方案2】:

    尝试这个。将 Excel 工作簿放入 SharePoint 后,从 SharePoint 中打开工作簿,然后选择编辑下拉菜单和在桌面应用程序中打开

    然后,在工作簿中,单击文件>信息>复制路径. (这将为您提供电源查询所需的路径以直接检索工作簿。这与您尝试使用 SharePoint 的复制路径功能复制路径时所获得的不同。)

    将该路径粘贴到安全的地方以供重复使用。然后关闭您的工作簿并打开 Power Query。

    在 Power Query 中,创建两个新参数:

    点击> 底部管理参数按钮 >新参数

    从更改名称参数1小路并改变类型文本,然后将您为工作簿复制的路径粘贴到当前值盒子。然后,从您刚刚粘贴的路径中,删除最后一个正斜杠 (/) 之后的所有文本。确保你在路径中包含最后一个 / 。您将 / 后面的文件名放在单独的参数中,不需要?web=1.

    单击确定。相反,单击新的,在“管理参数”窗口的顶部。这将设置您创建文件名参数。

    从更改名称参数1文件名并改变类型文本,然后将您为工作簿复制的文件名粘贴到当前值盒子。同样,您不需要?web=1从原来的路径。

    单击确定。

    现在您可以在源代码行中使用参数、路径和文件名。以下是如何做到这一点:

    Source = Excel.Workbook(Web.Contents(path & filename), null, true)
    

    这会给你一个像这样的表:

    --------------------------------------------------

    对于 Mirza 的后续操作,关于从 SharePoint 文件夹中提取文件,请尝试以下操作:

    1. 在获取数据中,选择 SharePoint 文件夹连接器并单击 连接。
    2. 对于 SharePoint 文件夹站点 URL,输入您的 URL 您的您在 SharePoint 中的文件的文件夹,然后单击“确定”。
    3. 您可能需要输入您的凭据。如果是这样,那就这样做。
    4. 此时,您应该会看到您在 SharePoint 中拥有的文件的列表。点击转换数据按钮。
    5. 在接下来看到的表格中:
      • 将“名称”列过滤为只有一个你的文件 想开。 (使用右上角的下拉箭头。)
      • 将文件夹路径列过滤为只有一个小路。 (同名 文件可以存储在多个文件夹中,您需要确保 您通过匹配正确的文件来选择正确的文件 文件夹,这为此奠定了基础。)
    6. 接下来,设置两个参数——路径和文件名——类似于我在第一种方法中所说的。但这一次:
      • 对于路径的当前值,粘贴您当前所在表的文件夹路径列中的值;和
      • 对于文件名的当前值,粘贴您当前所在表的名称列中的值。
    7. 然后,在 Filtered Rows 的公式框中,将文件名(包括引号)更改为 filename,并将路径名(包括引号)更改为 path。

      您应该以这样的代码结束(yourdomain.sharepoint.com/your/root/folder/URL 将是您的 URL在 sharepoint 中存放您的文档的文件夹):

      let
          Source = SharePoint.Files("https://yourdomain.sharepoint.com/your/root/folder/URL", [ApiVersion = 15]),
          #"Filtered Rows" = Table.SelectRows(Source, each (([Name] = filename and [Folder Path] = path)))
      in
          #"Filtered Rows"
      

      您应该看到如下内容:

      单击内容列中的二进制。

      -------------------------------------------------

      对于 Mirza 的第二次跟进,关于从 SharePoint 文件夹中提取多个文件而不是一个文件,请尝试以下操作:

      1. 在获取数据中,选择 SharePoint 文件夹连接器并单击 连接。
      2. 对于 SharePoint 文件夹站点 URL,输入您的 URL 您在 SharePoint 中的文件的根文件夹,然后单击“确定”。你可能有 输入您的凭据。如果是这样,那就这样做。
      3. 此时,您应该会看到您在 SharePoint 中的文件列表。点击转换数据按钮。

        1. 在接下来看到的表中:将文件夹路径列过滤为只有一条路--您想要的文件所在的文件夹的路径。 (请注意,这与查找单个文件不同,在我之前的答案中已解决,因为这会跳过按名称列进行过滤。)

        1. 接下来,设置一个名为路径的参数。对于路径的当前值,从您当前所在的表的文件夹路径列中复制并粘贴该值。
        • 从文件夹路径列复制路径:

        • 要将刚刚从文件夹路径列复制的路径粘贴到 路径参数的当前值:

          点击 Home,然后点击 Manage Parameters,如果还没有创建 path 参数,点击 new(否则点击 path 参数将其选中):

        确保您的路径参数设置如下:

        1. 然后,在 Filtered Rows 的公式框中,更改名称 路径的路径(包括引号)。也就是说,改变这个:

          = Table.SelectRows(Source, each ([Folder Path] = "https://yourdomain.sharepoint.com/sites/TestTeam/Shared Documents/General/"))

          至...

          = Table.SelectRows(Source, each (([Folder Path] = path)))

        您应该能够将路径参数的当前值替换为根文件夹中的任何其他有效文件夹路径。

        由于这些源文件位于 SharePoint 中,因此 SharePoint 的访问控制占主导地位。因此,为了让用户能够访问实际源文件(刷新需要执行此操作),需要刷新的用户将需要 SharePoint 对源文件的适当访问权限才能访问它们。但是,我相当肯定,一旦完成刷新,任何有权访问根据此查询结果构建的文件(无论是在 excel 还是 Power BI 文件中)的用户都应该能够在没有它们的情况下看到其结果需要对基础源文件的 SharePoint 访问权限。我的理解是,只有那些实际访问源文件的人,比如刷新,才需要 SharePoint 访问这些文件。无论如何,这一直是我的经验。

    【讨论】:

    • 有趣的方法,但是如果我想从文件夹本身获取文件,这(类似地)是否有效?并且是否/可以是动态的(如果共享,则与路径相关)?
    • 向下滚动到我之前回答的底部,查看使用参数从 SharePoint 文件夹中获取文件的方法。我使用参数是为了演示通过变量传递值。这些变量应该支持动态交互。
    • 我会试一试,让你知道。因为这是瓶颈问题,因为它没有直接的解决方案,但有一些核心点击...无论如何,谢谢!
    • 完成代码部分后,为每个新源使用它所要做的就是更改参数。
    • 你好!我一直在尝试使用来自 Sharepoint > From Folder 的动态文件路径的方法......但这不适用于整个文件文件夹,就像我的情况一样正在扩展。您在这里仅限于“只有一个”文件,但如果我收到月度报告,文件夹会越来越大。还是我错过了什么?
    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多