Power BI刷新避免使用网关,蚊子肉也是腿,电费也是钱
有朋友读了之后询问,是否可以获取Onedrive中某文件夹里的多个文件,而不使用网关,这个需求能否满足呢。
今天琢磨了一下,查了查相关资料和blog,终于找到了解决方案:
首先,数据文件放在onedrive的某个文件夹中:
我们按照常规思路,获取数据-从文件夹:
导航到所要选择的文件夹,加载:
整个过程的PQ底层逻辑很清楚,使用一个示例文件作为函数,然后用这个函数遍历文件夹中的所有文件,最终将结果合并到一张表中:
发布到云端,还是遇到相同的问题,需要安装并打开网关:
相同的疑问:onedrive文件夹本质上是网络位置,不该走gateway的,所以gateway完全多余。之所以必须通过gateway,原因就是导入的本质还是本地文件夹,并不是真实的onedrive网络位置。
解决思路:
仔细查看PowerQuery导入文件夹的整个过程用到的所有代码,其实你会发现,问题只有在源的位置:
很明显,后面的路径是绝对的本地路径。这正是Folder.Files能够识别的内容,而不能识别网络位置:
因此,接下来我们的任务就很清楚了,要准备两个内容:
1.获取onedrive文件夹的真实网络位置,将本地路径替换掉;
2.找出能识别onedrive真实网络位置的函数,将Folder.Files替换掉。
同样还是前一篇文章中的“打开文件-信息-打开文件位置-复制路径”:
只不过这次我们应该复制到账号名的位置(即根目录)即可。
https://xueqianpbi-my.sharepoint.cn/personal/admin_xueqianpbi_partner_onmschina_cn/
你也可以点击打开:
然后登录onedrive,截取网址的前半部分:
至于为什么不直接截取全部的路径,我们一会再说。
解决了路径问题,接下来,我们要选取替换Folder.Files的函数了。
由于onedrive的网址是SharePoint域名,所以我们搜一下与SharePoint相关的函数:
一共有三个,我们分别看一下微软文档中简介和从以上路径获取的信息:
1.SharePoint.Files
SharePoint.Files获取的是文件,根目录下和子文件夹下的所有文件:

2.SharePoint.Tables
SharePoint.Tables获取的是list item,并不是文件和文件夹,这些东西很明显不是我们想要的:
3.SharePoint.Contents
SharePoint.Contents获取的是根目录下的所有文件夹和文件:
Onedrive的全部文件都在documents里,可以导航获取文件夹中的内容:
很显然,这符合我们的要求。
由此,我们可以得出结论:
SharePoint.Contents是我们所需的函数。
解决了上面两个问题,我们就可以使用SharePoint.Contents函数和获取的链接进行操作了:
取了Onedrive中的所有文件夹,接下来导航到自己想要的文件夹,然后合并文件即可:
这样就得到了合并的文件内容:
发布报告,我们再次到云端查看,网关是关闭状态的,编辑一下数据源权限,即可手动刷新和计划刷新了。
这个问题到这就解决完毕了。
以下解释一下几个细节。
1.至于为什么一定要使用根目录,原因是我在测试过程中,PQ出现的一个错误给的提示:
所以,要直接获取文件就填写实体的url,要获取文件夹就使用根目录url。
不过,直接使用根目录其实还有一个隐藏的好处。正如在这篇文章中说的:
从Power BI“最近使用的源”到盗梦空间的“植梦”
如果将所有的excel文件都放在onedrive中(强烈建议这么做),那么之后我们再想往模型中添加excel文件,只需要点击最近使用的源,再根据实际情况导航选择即可:
2.还有一个bug就是,有些时候,你按照以上步骤操作时,可能会得到一个空表:
测试了多次,世纪互联版的onedrive链接经常会出现这样的情况,不过国际版没出现过,也没有找到具体什么原因。后续抽空再研究研究。