更新钉钉文档封装好的代码

2023-12-18

import json
import requests

class OperateKnowledgeBaseExcel():
    robot_code = ''       #机器人
    agent_id = ''         
    app_key = ''          #机器人密钥  获取方法见我的其他博客
    app_secret = ''       #机器人密钥

    def __init__(self,union_id, workbook_id, worksheet_id=''):
        self.union_id = union_id
        self.workbook_id = workbook_id  # 获取方式:... > 文档信息 > 表格ID
        self.worksheet_id =  worksheet_id # 获取方式:self.get_workbook_sheet_names() 拿到所有sheet名称和id
        if not self.union_id:
            raise Exception('请先设置union_id')

        self.access_token = self.get_access_token()

    def get_access_token(self):
        """ 获取token: https://open.dingtalk.com/document/orgapp/obtain-orgapp-token """
        headers = {'Content-Type': "application/x-www-form-urlencoded"}
        url = f"https://oapi.dingtalk.com/gettoken/?appkey={self.app_key}&appsecret={self.app_secret}"
        resp = requests.get(url, headers=headers)
        # print(resp.json()['access_token'])
        return resp.json()['access_token']

    def get_workbook_sheet_names(self):
        """
        获取工作表信息,包含工作表名称、工作表id
        开发者文档:https://open.dingtalk.com/document/orgapp/obtain-all-worksheets
        """
        url = f'https://oapi.dingtalk.com/v1.0/doc/workbooks/{self.workbook_id}/sheets?operatorId={self.union_id}'
        headers = {
            'Content-Type': "application/json",
            'Host': 'api.dingtalk.com',
            'x-acs-dingtalk-access-token': self.access_token
        }
        resp = requests.get(url, headers=headers)
        # print(resp.json())
        return resp.json()

    def get_worksheet_describe(self):
        """
        获取工作表的描述
        开发者文档:https://open.dingtalk.com/document/orgapp/obtain-worksheet-properties
        """
        url = f'https://oapi.dingtalk.com/v1.0/doc/workbooks/{self.workbook_id}/sheets/{self.worksheet_id}?operatorId={self.union_id}'
        headers = {
            'Content-Type': "application/json",
            'Host': 'api.dingtalk.com',
            'x-acs-dingtalk-access-token': self.access_token
        }
        resp = requests.get(url, headers=headers)
        # print(resp.json())
        return resp.json()

    def get_all_cells_area(self):
        """ 获取表格的全部区域,如:A1:D4 """
        worksheet_describe = self.get_worksheet_describe()
        last_row = worksheet_describe['lastNonEmptyRow']
        last_column = worksheet_describe['lastNonEmptyColumn']
        range_address = f'A1:{get_column_letter(last_column + 1)}{last_row + 1}'
        return range_address

    def read(self, range_address=False):
        """
        读取工作表数据
        开发者文档:https://open.dingtalk.com/document/orgapp/get-cell-properties
        """
        if not range_address:  # 如果没有指定读取区域,则读取整个工作表
            range_address = self.get_all_cells_area()
        url = f'https://oapi.dingtalk.com/v1.0/doc/workbooks/{self.workbook_id}/sheets/{self.worksheet_id}/ranges/{range_address}?select=values&operatorId={self.union_id}'
        headers = {
            'Content-Type': "application/json",
            'Host': 'api.dingtalk.com',
            'x-acs-dingtalk-access-token': self.access_token
        }
        resp = requests.get(url, headers=headers)
        data = pd.DataFrame(columns=resp.json()['values'][0], data=resp.json()['values'][1:])
        data.replace('', pd.NA, inplace=True)
        return data

    def update(self, range_address, values):
        """
        更新工作表指定区域的数据
        开发者文档:https://open.dingtalk.com/document/orgapp/get-cell-properties
        :param range_address: 更新区域,如:A2:B3
        :param values: 更新的数据,如:[['张三', 18], ['李四', 19]]
        """
        url = f'https://oapi.dingtalk.com/v1.0/doc/workbooks/{self.workbook_id}/sheets/{self.worksheet_id}/ranges/{range_address}?operatorId={self.union_id}'
        headers = {
            'Content-Type': "application/json",
            'Host': 'api.dingtalk.com',
            'x-acs-dingtalk-access-token': self.access_token
        }
        data = {"values": values}
        resp = requests.put(url, data=json.dumps(data), headers=headers)
        print("更新工作表区域:", resp.json())

    def delete(self, range_address=False):
        """
        清空工作表指定区域的数据,仅清除数据,不清除格式
        开发者文档:https://open.dingtalk.com/document/orgapp/get-cell-properties
        """
        if not range_address:  # 如果没有指定读取区域,则清空整个工作表
            range_address = self.get_all_cells_area()

        url = f'https://oapi.dingtalk.com/v1.0/doc/workbooks/{self.workbook_id}/sheets/{self.worksheet_id}/ranges/{range_address}/clearData?operatorId={self.union_id}'
        headers = {
            'Content-Type': "application/json",
            'Host': 'api.dingtalk.com',
            'x-acs-dingtalk-access-token': self.access_token
        }
        resp = requests.post(url, headers=headers)
        print('清空工作表区域:', resp.json())


userid = ''    #钉钉账号
workid = ''    #文档id

def worksheetinsert(df,number=1,worksheetid=''):
    if df.empty:
        return
    # 转换列索引为Excel的列名称
    def col_num_to_letter(col_num):
        string = ""
        while col_num > 0:
            col_num, remainder = divmod(col_num-1, 26)
            string = chr(65 + remainder) + string
        return string
    # 获取行数和列数
    num_rows, num_cols = df.shape

    # 因为包括列名,所以行数需要加1
    range = f"A{number}:{col_num_to_letter(num_cols)}{num_rows + number}"
    print(range)

    # 将数据转换为列表形式
    values = df.values.tolist()
    values = [df.columns.tolist()] + [[str(item) for item in row] for row in values]

    # 构造字典对象
    data = values
    try:
        temp = OperateKnowledgeBaseExcel(userid,workid,worksheetid).read()
        OperateKnowledgeBaseExcel(userid,workid,worksheetid).delete()
    except:
        pass
    OperateKnowledgeBaseExcel(userid,workid,worksheetid).update(range,data)

df = 

excelsheet_json = OperateKnowledgeBaseExcel(userid,workid).get_workbook_sheet_names()
excelsheet = {item['name']: item['id'] for item in excelsheet_json['value']}


#指定表sheet名插入
worksheetinsert(df,number=1,worksheetid=excelsheet['XXX'])
  1. 获取访问令牌:通过设置机器人的密钥和密钥获取访问令牌。

  2. 获取工作表信息:获取工作表的名称和ID。

  3. 获取工作表描述:获取工作表的描述信息。

  4. 获取全部单元格区域:获取工作表的全部区域。

  5. 读取数据:读取指定区域的数据,并将其转换为DataFrame格式返回。

  6. 更新数据:更新指定区域的数据。

  7. 清空数据:清空指定区域的数据,但保留格式。

  8. 插入数据到指定表格:将DataFrame格式的数据插入到指定的工作表中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新钉钉文档封装好的代码 的相关文章

  • Python 切片对象和 __getitem__

    python 中是否有内部的东西来处理传递给的参数 getitem 不同 并自动转换start stop step构造成切片 这是我的意思的演示 class ExampleClass object def getitem self args
  • 从文本文件中删除特定字符

    我对 Python 和编码都很陌生 我当时正在做一个小项目 但遇到了一个问题 44 1 6 23 2 7 49 2 3 53 2 1 68 1 6 71 2 7 我只需要从每行中删除第三个和第六个字符 或者更具体地说 从整个文件中删除 字符
  • 使用python查找txt文件中字母出现的次数

    我需要从 txt 文件中读取该字母并打印 txt 文件中出现的次数 到目前为止 我已经能够在一行中打印内容 但计数有问题 有人可以指导吗 infile open grades txt content infile read for char
  • 按边距(“全部”)值列对 Pandas 数据透视表进行排序

    我试图根据 pandas 数据透视表中的行总和对最后一列 边距 aggrfunc 进行降序排序 我知道我在这里错过了一些简单的东西 但我无法弄清楚 数据框 数据透视表 WIDGETS DATE 2 1 16 2 2 16 2 3 16 Al
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 使用 Boto3 以字符串形式打开 S3 对象

    我知道使用 Boto 2 可以使用以下命令将 S3 对象作为字符串打开 get contents as string http boto readthedocs org en latest ref file html highlight c
  • Matplotlib:如何有效地将大量线段着色为独立渐变

    Python 绘图库 如何有效地将大量线段着色为独立渐变 已经 阅读this https stackoverflow com questions 8500700 how to plot a gradient color line in ma
  • 如何过滤 Pandas GroupBy 对象并获取 GroupBy 对象?

    当对 Pandas groupby 操作的结果执行过滤时 它返回一个数据帧 但假设我想执行进一步的分组计算 我必须再次调用 groupby 这似乎有点绕 有更惯用的方法吗 EDIT 为了说明我在说什么 我们无耻地从 Pandas 文档中窃取
  • 协程从未被等待

    我正在使用一个简单的上下文管理器 其中包含一个异步循环 class Runner def init self self loop asyncio get event loop def enter self return self def e
  • Arcpy 模数在 Pycharm 中不显示

    如何将 Arcpy 集成到 Pycharm 中 我尝试通过导入模块但它没有显示 我确实知道该模块仅适用于 2 x python arcpy 在 PyPi Python 包索引 上不可用 因此无法通过 pip 安装 要使用 arcpy 您需要
  • Python HMAC:类型错误:字符映射必须返回整数、None 或 unicode

    我在使用 HMAC 时遇到了一个小问题 运行这段代码时 signature hmac new key secret key msg string to sign digestmod sha1 我收到一个奇怪的错误 File usr loca
  • 根据其他单元格值更改多个单元格值

    我想更改包含的单元格moving to movingToOpenor movingToClose基于下一个单元格中给出的状态 有时循环会被中断并且不会从open to close or close to open 这是我当前的数据框 Dat
  • 是否需要关闭没有引用它们的文件?

    作为一个完全的编程初学者 我试图理解打开和关闭文件的基本概念 我正在做的一项练习是创建一个脚本 允许我将内容从一个文件复制到另一个文件 in file open from file indata in file read out file
  • Python 中维基百科 API 中的 DisambiguationError 和 GuessedAtParserWarning

    我想获得维基百科与搜索词相关的可能且可接受的名称列表 在这种情况下是 电晕 当输入以下内容时 print wikipedia summary Corona 这给出了以下输出 home virej local lib python3 8 si
  • 使用另一个数据帧在数据帧中创建子列

    我对 python 和 pandas 很陌生 在这里 我有一个以下数据框 did features offset word JAPE feature manual feature 0 200 0 aa 200 200 0 200 11 bf
  • Python bug - 或者我的愚蠢 - 扫描字符串文字时 EOL

    我看不出以下两行之间有显着差异 然而第一个解析 而后者则不解析 In 5 n Axis of Awesome In 6 n Axis of Awesome File
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • 无法安装最新版本的 Numpy (1.22.3)

    我正在尝试安装最新版本的 numpy 即 1 22 3 但看起来 pip 无法找到最后一个版本 我知道我可以从源代码本地安装它 但我想了解为什么我无法使用 pip 安装它 PS 我有最新版本的pip 22 0 4 ERROR Could n

随机推荐

  • oracle数据库密码有限期查询

    SELECT FROM dba profiles WHERE resource name PASSWORD LIFE TIME oracle数据库密码有限期修改为 无限期 ALTER PROFILE DEFAULT LIMIT PASSWO
  • 扬帆证券:证券约定购回是什么?包括哪些基本要素?

    证券约好购回是什么 证券约好购回是指投资者按约好价格向券商卖出标的证券 并约好好在未来的某一时期按照另一约好价格从券商手中买回该标的证券的生意行为 该生意目的是为了帮助投资者的进行短期的资金融通 证券约好购回包括了初始生意和购回生意共两次生
  • equals()和hashcode() 方法的区别

    equals和hashCode方法主要的区别在于 性能 可靠性 对于需要大量并且快速对比 如果都用equals比较效率太低 所以每当需要对象比较时 先用hashCode对比 如果hashCode值不一样 两对象肯定不相等 也就没必要再用eq
  • jQuery 动画 - animate() 方法

    jQuery animate 方法用于创建自定义动画 语法 selector animate params speed callback 必需的params参数定义形成动画的CSS属性 可选的speed参数规定效果的时长 它可以取以下值 s
  • 题解 | #平均活跃天数和月活人数#

    金融科技岗分享 欢聚shopline 凉 又遇毁到offer 爱奇艺互动产品运营实习面经 百度大搜2024校招补录 搜索时效性团队工作职责 1 通过query理解 召回 排序全链路的优化 持续优化百度搜索时效排序效果2 持续探索落地最前沿的
  • SQL使用WITH ROLLUP子句计算每个分组的合计值

    先来看一个示例的SQL查询语句 假设我们有一个名为t sales的表 记录了销售订单的信息 包括订单日期 销售额等字段 我们想要按照订单日期进行分组 并计算每天的销售总额和总订单数 同时还希望得到整体的销售总额和订单数 SELECT IFN
  • 扬帆证券:长线资金积极涌入 新能源汽车产业链获青睐

    近日 广汽集团与中国银行 广州工业出资控股集团有限公司举行了战略协作签约仪式 三方将作为有限合伙人按33 4 33 3 33 3 的份额认缴出资 建议建立广州新祺智联股权出资基金 据悉 该基金总规划为300亿元 首期规划为100亿元 由广汽
  • jQuery - 获取内容和属性

    jQuery拥有可操作HTML元素和属性的强大方法 jQuery DOM操作 jQuery中非常重要的部分 就是操作DOM的能力 jQuery提供一系列与DOM相关的方法 这使访问和操作元素和属性变得很容易 lamp DOM Documen
  • Andriod:andriod手机屏幕坐标系

    如图所示 左上角为坐标原点 越向下 y值越大 越向右 x值越大
  • 玩转 TableAgent 数据智能分析

    一 什么是数据智能分析 数据智能分析 是指利用先进的技术和工具对 大量数据 进行收集 整理 分析和挖掘 以获取有益的信息和见解 这种分析通常涉及 人工智能 机器学习 数据挖掘和统计分析 等技术 旨在揭示数据背后隐藏的模式 关联和趋势 以帮助
  • AtCoder Beginner Contest 332 G. Not Too Many Balls(最大流转最小割 dp)

    题目 n n lt 500 种球 第i种有ai 0 lt ai lt 1e12 个球 m m lt 5e5 个盒子 第j个能放bj 0 lt bj lt 1e12 个球 特别地 第j个盒子最多能放i j个第i种球 求m个盒子能放的最多的球的
  • 扬帆证券:优先股有哪些限制?怎样才能持有优先股?

    优先股有哪些束缚 持有优先股相较于持有一般股 在行使一些公司权力时会受到束缚 如优先股持股股东不能行使选举权及被选举权 虽然对公司事务可以提出建议但无表决权等 另外 由于优先股股息率事前设定 也就是股息固定 那么不论公司市值怎样上涨 股票价
  • 中国首家!腾讯云入选Gartner®视频平台服务市场指南代表厂商

    近日 Gartner正式发布 Market Guide for Video Platform Services 视频平台服务市场指南 下称 指南 凭借领先的音视频技术和产品组合优势 腾讯云成为中国首家且唯一入选的代表厂商 腾讯云VPS一站式
  • 人工智能深度学习:探索智能的深邃奥秘

    导言 人工智能深度学习作为当今科技领域的明星 正引领着智能时代的浪潮 深度学习和机器学习作为人工智能领域的两大支柱 它们之间的关系既有协同合作 又存在着显著的区别 本文将深入研究深度学习在人工智能领域的角色 以及其在各行各业中的深远影响 研
  • 鸿蒙开发入门:app对象内部结构

    app对象内部结构 app对象包含应用全局配置信息 内部结构如下 表1 app对象内部结构说明 属性名称 含义 数据类型 是否可缺省 bundleName 标识应用的Bundle名称 用于标识应用的唯一性 Bundle名称是由字母 数字 下
  • 24届还有在看工作机会的吗,求求大家看下小米吧,HC非常多

    一定要反问HR的六个问题 offer比较 华为 vs OPPO 离谱的一周 百度裁应届 拼多多 非必要就别去了吧 阿里云25k gt 美团29k 实习转正啦 进来看耍猴 12 17更新 25届实习招聘信息汇总走起 策论 设计产出 Learn
  • 人工智能智能控制系统:引领未来智能化时代

    导言 人工智能智能控制系统是当今科技领域的热点之一 它不仅在工业生产中发挥着关键作用 也在生活中展现出前所未有的智能化特征 本文将深入探讨人工智能智能控制系统的定义 应用领域和未来发展趋势 深入探讨如何实现智能控制系统与人工智能的有机结合
  • 扬帆证券:什么是股票股利?它和现金股利之间的区别是什么?

    什么是股票股利 股票股利是公司以其所发行股票作为股利的支付办法 它将发放的分红换算为等值的股份 完结持股人股份的增加 对公司来说 选用股票股利进行无偿增发新股时 既不减少公司现金 又能给予股东利润 值得一提的是 如果公司采取现金股利的分红支
  • 颜色分析.

    介绍 宽光谱光源对许多光学系统都很重要 应用范围包括白光照明 分光计等 FRED中的颜色图像分析 是通过计算每个像素的色度坐标并在表面上显示生成的RGB值来生成颜色分布 此外 FRED还可以显示彩色色度图 并在用户移动光标时指示每个像素的色
  • 更新钉钉文档封装好的代码

    import json import requests class OperateKnowledgeBaseExcel robot code 机器人 agent id app key 机器人密钥 获取方法见我的其他博客 app secret