记录一下python 写入钉钉在线表格的过程
标签搜索

记录一下python 写入钉钉在线表格的过程

irx999
2023-12-01 / 1 评论 / 52 阅读 / 正在检测是否收录...

成为开发者

自己创建一个企业, 或者让你所在的公司给予你的账号一个权限 钉钉开发者后台登录

创建一个应用

lpm0iw2u.png
如图,
这里只需要

  1. Client ID (原 AppKey 和 SuiteKey)
  2. Client Secret (原 AppSecret 和 SuiteSecret)
    这两个东西 获取 access_token
    然后还需要一个userid 提供的operatorId:表示待办事项的操作者的ID,是一个唯一的标识符。
    这个可以在钉钉提供的API接口直接获取到, 目前来看是不会变化的

后面就是源码了

import requests
import json
import  pandas as pd
import datetime




class Ding():

    def __init__(self,appkey,appsecret,operatorId,df_data,sheetid,sheetname,wt_range):
        
        

        access_token = requests.get("https://oapi.dingtalk.com/gettoken?appkey={appkey}&appsecret={appsecret}").json()["access_token"]
        # print(access_token)
        self.Header = {  'Host':'api.dingtalk.com',
                    'x-acs-dingtalk-access-token':access_token,
                    'Content-Type':'application/json'}
        self.df = df_data
        self.total = len(df_data)
        self.operatorId = operatorId
        self.sheetid= sheetid
        self.sheetname = sheetname
        self.begin = list(wt_range)
        self.width = [chr(i) for i in range(97,123)][df_data.shape[1]-2+int(self.begin[1])]
    def meterHead(self,df):
        url = f"https://api.dingtalk.com/v1.0/doc/workbooks/{self.sheetid}/sheets/{self.sheetname}/ranges/{self.begin[0]}{int(self.begin[1])}:{self.width}{int(self.begin[1])}?operatorId={self.operatorId}"
        # data = ERP(erpcookie).get_Goods_Stock()[1].astype("str").iloc[start-1:end, :].values.tolist()
        json1 = {"values" : [df.columns.tolist()]}
        print(df.columns.tolist())
        x1 = requests.put(url= url,headers= self.Header,data=json.dumps(json1),verify=False)
        print(url)
        print(x1.text)
    def w_time(self,range):
        url = f"https://api.dingtalk.com/v1.0/doc/workbooks/{self.sheetid}/sheets/{self.sheetname}/ranges/{range}?operatorId={self.operatorId}"
        # data = ERP(erpcookie).get_Goods_Stock()[1].astype("str").iloc[start-1:end, :].values.tolist()
        now  = datetime.datetime.now().strftime("%Y-%m-%d-%H:%M")
        
        json1 = {"values" : [[now]]}
        
        x1 = requests.put(url= url,headers= self.Header,data=json.dumps(json1),verify=False)
        print(url)
        print(x1.text)




    def toding(self,df,start,end):
        url = f"https://api.dingtalk.com/v1.0/doc/workbooks/{self.sheetid}/sheets/{self.sheetname}/ranges/{self.begin[0]}{start+int(self.begin[1])}:{self.width}{end+int(self.begin[1])}?operatorId={self.operatorId}"
        json1 = {"values" : df.astype("str").iloc[start-1:end, :].values.tolist()}
        x1 = requests.put(url= url,headers= self.Header,data=json.dumps(json1),verify=False)
        print(url)
        print(x1.text)

    def cycle(self,number):
        
        num_segments = number // 1000
        for i in range(num_segments):
            start = i * 1000 + 1
            end = (i + 1) * 1000
            self.toding(self.df,start,end)

        if number % 1000 != 0:
            start = num_segments * 1000 + 1
            end = number
            self.toding(self.df,start,end)
    def main(self):
        self.w_time(range = "O1")
        self.meterHead(self.df)
        self.cycle(len(self.df))

if __name__ == "__main__":
    
    
    Ding(appkey = "密钥",
         appsecret="密钥",
         operatorId = "userid",
        df_data= "pandas的dataframe",
        sheetid= "表格id",
        sheetname= "表格名称",
        wt_range= "A1"
        ).main()
0

评论 (1)

取消
  1. 头像
    冷柠 作者
    Windows 10 · Google Chrome

    画图

    回复