- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人试过使用 Beatbox 将 SalesForce 报告解析为 Pandas DataFrame 吗? SO 上有几个示例,但没有一个提供全面的解决方案,或者至少我认为没有。
#!/usr/bin/env python3
import beatbox
import pandas as pd
sf = beatbox._tPartnerNS
service = beatbox.Client()
service.serverUrl = 'https://login.salesforce.com/services/Soap/u/38.0'
service.login('my-username', 'my-password')
report_id = '00myreport4G3V'
query = "SELECT Name FROM Report where id = '{}'".format(report_id)
query_result = service.query(query)
这只是选择名称,但理想情况下我想将报告的内容加载到 DataFrame 中。有什么帮助吗?
最佳答案
报告数据可以通过Salesforce Reports and Dashboards REST API检索.自 Summer'15(版本 34.0)以来,这在 Salesforce 中有效。
我用包 Simple-salesforce 写了一个例子,由于 REST API。 (然而,可以在没有 simple-salesforce 的情况下重写它并使用来自 Beatbox 的 api session ,编写至少大约 10 行额外的代码并仅安装 requests 包。)
通用代码
from collections import OrderedDict
from simple_salesforce import Salesforce
import pandas as pd
import json
class SfReportsApi(Salesforce):
def __init__(self, *args, **kwargs):
super(SfReportsApi, self).__init__(*args, **kwargs)
def describe_report(self, report_id):
return self._call_report(report_id, command='/describe')
def to_pandas_dataframe(self, report_id, metadata=None):
"""SF report details exported to DataFrame, can be modified by metadata"""
resp = self._call_report(report_id, metadata=metadata)
if not resp['allData']:
print("Detailed data have been truncated to the usual report limit (2000).")
columns = []
converters = []
get_label = lambda x: x['label']
sf_pandas_map = {
'boolean': lambda x: x['value'],
'currency': lambda x: x['value'].get('amount'),
'date': lambda x: pd.Timestamp(x['value']),
'datetime': lambda x: pd.Timestamp(x['value']),
'double': lambda x: x['value'],
'picklist': get_label,
'string': get_label,
'textarea': get_label,
}
for col in resp['reportExtendedMetadata']['detailColumnInfo'].values():
columns.append(col['label'])
converters.append(sf_pandas_map.get(col['dataType'], get_label))
data = [[conv(cell) for conv, cell in zip(converters, row['dataCells'])]
for sect_key, section in resp['factMap'].items()
if 'rows' in section
for row in section['rows']
]
df = pd.DataFrame(data, columns=columns)
return df
def _call_report(self, report_id, metadata=None, command=None):
url = '{}analytics/reports/{}{}'.format(self.base_url, report_id, command or '')
data = json.dumps({'reportMetadata': metadata}) if metadata else None
resp = self._call_salesforce('POST' if metadata else 'GET', url, data=data)
return resp.json(object_pairs_hook=OrderedDict)
使用示例
report_id = '00O24000004qtI4EAI'
# set Salesforce session_id some way (by login or reused from other app)
sf = SfReportsApi(username='me@example.com', password='password', security_token='token')
# sf = SfReportsApi(instance_url='https://na1.salesforce.com', session_id='')
# get report metadata if useful
metadata = sf.describe_report(report_id)['reportMetadata']
# modify them or write only the modified keys, e.g. change filters or remove subtotals etc.
metadata = {
'orderBy': ['ACCOUNT.NAME'],
'reportFilters': [{'value': 'W', 'column': 'ACCOUNT.NAME', 'operator': greaterOrEqual'}]
}
# or you can omit `metadata` parameter and use the report as is without changing anything
df = sf.to_pandas_dataframe(report_id, metadata)
可以动态添加列、过滤器、排序等(关于 report Execute synchronous 的文档)。 to_pandas_dataframe
方法用于包含详细信息的普通表格报告,并且可以选择包含一个总计且不超过一级小计。可以从更复杂的报告中检索数据(请参阅有关 Decode the Fact Map 或 cheatsheet 的文档),但它没有实现,因为在运行之前通过元数据参数更容易即时删除它们。
只能报告2000行详细数据。可以使用多个带有过滤器的请求来查看所有数据。
固定代码 新代码适用于任何包含原始行的报告。它不适用于没有原始行的摘要报告。 (旧代码仅适用于包含行和小计的报告。请原谅)
关于pandas - 使用 Beatbox 解析 Pandas DataFrame 中的 Salesforce 报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41004155/
我从下面的代码行收到错误“错误错误:AddIMRConroller 编译错误:字段表达式的初始术语必须是具体的 SObject:第 21 行第 23 列的列表”。 string[] str1 = im
Salesforce 支持不同的沙箱。 例如“部分”或“开发”沙箱。 有没有办法检测我的脚本连接到哪种沙箱? 我使用 Python 和 simple_salesforce。 最佳答案 我的 Pytho
下面一行在 salesforce 中给出了“FIELD_INTEGRITY_EXCEPTION”。请为此提供替代方案。 imr.Assigned_DTM__c = DateTime.valueOfGm
下面一行在 salesforce 中给出了“FIELD_INTEGRITY_EXCEPTION”。请为此提供替代方案。 imr.Assigned_DTM__c = DateTime.valueOfGm
我正在尝试实现批处理。我需要一些关于如何测试的帮助/指导。我在这里所做的只是在调试日志中显示机会名称。但是当我在 Apex 测试执行中运行 scheduleBatchable 类时,它也有测试类。未显
我在 salesforce 中创建了一个包,它将使用用户的电子邮件 ID 发出 http 标注请求以获取该电子邮件的数据并将数据添加到某个自定义对象。但是当我尝试使用 UserInfo.getUser
我正在尝试将 Salesforce 数据加载到 Python 数据框中,以便我们可以在那里进行所有操作。 simple_salesforce 处理了我们达到 2,000 限制的警告: from sim
我在 Salesforce 托管包中编写了一个 Apex 类,它使用 apex-lang 的托管版本。库包: global class MySorter implements al.Objectcom
我已经开始使用现有的应用程序,并且代码的唯一副本在 SalesForce 中。我如何备份(导出)它,以便在我弄得一团糟时可以回滚到这个原始代码? 最佳答案 有几个选项可以备份或添加版本控制到您的 Sa
Salesforce 向我抛出了一条新的错误消息,到目前为止我还没有在文档中找到任何有用的信息。我试图在 Controller 扩展中保存一个对象,它实际上保存了记录,但它没有返回到我指示的页面,而是
我需要防止输入重复名称。需要使用触发器来施加此限制。我想知道如何限制 DML 操作的发生。不确定 .addError 在批量代码中的用法。 Set Seta= new Set(); for(oj_
我正在尝试通过创建一个触发器来解决基于“邮箱已满”的邮件退回问题,该触发器在邮件包含“邮箱已满”时重新发送邮件。 我面临的问题是我需要将重新发送的次数限制为 3 次。 一旦收到退回的电子邮件,我现在就
salesforce.com 中单个自定义对象中的最大记录数是多少? https://login.salesforce.com/help/doc/en/limits.htm 中似乎没有指出限制 当然,
是否可以为具有配置文件的用户使用共享规则。如果用户有配置文件,它们有什么用吗?或者配置文件是否完全覆盖了记录访问权限,这样我就可以忘记共享规则? 我的情况是我的所有用户都有个人资料。我想做的是将某些记
自从我不得不进行 S2S 集成以来,已经发布了几个版本,但我遇到了一个意想不到的问题,希望有人能更有效地解决这个问题。 我有两个组织,通过 S2S 共享联系人。 每个组织中的联系人都具有相同的架构,即
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 去年关闭。 社区在 3 个月前审查了是否重新
我正在查看SOQL文档,但找不到查询来获取实体的所有字段数据,例如Account,例如 select * from Account [ SQL syntax ] SOQL中是否有类似上面的语法来提取a
我正在尝试通过允许指定无效电子邮件地址的其他服务将电子邮件地址存储在 Salesforce.com 中。如果这些错误的无效电子邮件地址之一通过其 Web 服务 API 发送到 Salesforce.c
我想获取安装在 salesforce 组织中的所有包的命名空间前缀。我该怎么做? 最佳答案 一种相当简单的方法是查询 ApexClass 对象并获取不同的 NamespacePrefix 值。 Sel
你好, 好吧,我很困惑。我的任务是更新一个 PHP 脚本,该脚本使用 BulkAPI 将一些数据 upsert 到 Opportunity 实体中。 这一切都很顺利,只是 Bulk API 为一些明确
我是一名优秀的程序员,十分优秀!