为了演示 Workiva 脚本在 Workiva 中的工作原理,我们构建了一个简单的脚本来更新电子表格中的单元格。您可以按照以下步骤在您自己的工作空间中复制该脚本。
注:目前仅可通过自定义 Workiva 实现脚本编写。了解更多。
要求
- 您的工作区必须启用 Workiva 脚本功能。了解更多关于Workiva脚本的信息。
- 要创建或编辑脚本,需要 脚本编辑器 角色。
- 您必须生成 依赖 项才能直接从电子表格运行此脚本。这将包括与 Workiva 公共API 交互所需的“ requests”库。
编写脚本
要在您的工作区中构建脚本,请按照以下步骤操作:
- 从主页,点击 + 创建 => 脚本。
- 在右侧,输入剧本名称和简短描述。
- 转到屏幕中间的脚本编辑器,删除所有现有代码。复制并粘贴以下内容:
import requests import json import os AUTH_URL = "https://api.app.wdesk.com/iam/v1/oauth2/token" SS_API_URL = 'https://api.app.wdesk.com/platform/v1/spreadsheets/' CLIENT_ID = os.getenv('CLIENT_ID') CLIENT_SECRET = os.getenv('CLIENT_SECRET') SPREADSHEET_ID = os.getenv('SPREADSHEET_ID') SHEET_ID = os.getenv('SHEET_ID') HELLO_WORLD = os.getenv('HELLO_WORLD') class ApiAuth: def __init__(self): self._headers = {'Content-Type': \ 'application/x-www-form-urlencoded;charset=UTF-8'} def getAuthToken(self): tokenRes = requests.post(AUTH_URL, data = 'client_id=' + CLIENT_ID + \ '&client_secret=' + CLIENT_SECRET + '&grant_type=client_credentials', \ headers = self._headers) tokenResponse = json.loads(tokenRes.text) return tokenResponse['access_token'] class SSApi: def __init__(self, accessToken): self._accessToken = 'Bearer ' + accessToken self._ssApiUrl = SS_API_URL + SPREADSHEET_ID + "/sheets/" + SHEET_ID + \ "/values/A2:H" self._headers = {'Authorization': self._accessToken} def getRawData(self): dataRes = requests.get(self._ssApiUrl, headers=self._headers) # print(dataRes) rawData = json.loads(dataRes.text) # todo 处理分页 # print("---", rawData['data'][0]['values'][0]) return rawData['data'][0]['values'] def updateRange(self, sheetId, range, values): url = SS_API_URL + SPREADSHEET_ID + "/sheets/" + sheetId + "/values/" + \ range print("更新范围:", url) print("值:", values) dataRes = requests.put(url, headers=self._headers, \ data=json.dumps(values)) def write_tier_data(ssApi: SSApi): values = [] values.append([HELLO_WORLD]) ssApi.updateRange(SHEET_ID, 'A1:ZZZZ99', {"values": values}) def main(): authToken = ApiAuth().getAuthToken() ssApi = SSApi(authToken) # rawData = ssApi.getRawData() write_tier_data(ssApi) print('调用 main') main() - 点击 保存。
此时,您应该确保 已为此脚本生成必要的依赖 项。
运行脚本
手动运行脚本:
- 打开脚本后,点击屏幕顶部菜单栏中的 运行脚本 。
- 输入访问电子表格 API 所需的参数、电子表格和工作表 ID 以及单元格的文本内容。点击 运行脚本。
注:ID 可在电子表格的 URL 中找到: /spreadsheet/{spreadsheetId}/sheet/{sheetId}.
要验证脚本是否执行完毕,请检查电子表格中更新后的单元格。
直接从电子表格运行脚本
该脚本以及其他类似脚本也可以通过使用 自动化直接从电子表格运行。
要将此脚本与自动化流程一起使用:
- 删除现有代码。
- 将其替换为以下代码:
import requests import json import os AUTH_URL = "https://api.sandbox.wdesk.com/iam/v1/oauth2/token" SS_API_URL = 'https://api.sandbox.wdesk.com/platform/v1/spreadsheets/' # CLIENT_ID = os.getenv('CLIENT_ID') # CLIENT_SECRET = os.getenv('CLIENT_SECRET') # SPREADSHEET_ID = os.getenv('SPREADSHEET_ID') # SHEET_ID = os.getenv('SHEET_ID') # HELLO_WORLD = os.getenv('HELLO_WORLD') CLIENT_ID = "" # 在此处输入您的客户端 ID CLIENT_SECRET = "" # 在此处输入您的客户端密钥 DOCUMENT_ID = os.getenv('DOCUMENT_ID') INPUT_SHEET_ID = os.getenv('INPUT_SHEET_ID') INPUT_RESOURCE_ID = os.getenv('INPUT_RESOURCE_ID') def getSpreadsheetId(wurl): start = wurl.find("sheets_") if (start >= 0): return wurl[start + len("sheets_"):] return None def getSpreadsheetSectionId(sheetId, wurl): start = wurl.find("sheets_" + sheetId + "_") if (start >= 0): return wurl[start + len("sheets_" + sheetId + "_"):] return None SPREADSHEET_ID = getSpreadsheetId(INPUT_SHEET_ID) if SPREADSHEET_ID != None : SHEET_ID = getSpreadsheetSectionId(SPREADSHEET_ID, INPUT_RESOURCE_ID) HELLO_WORLD = "Holaaaaaaaaaa" class ApiAuth: def __init__(self): self._headers = {'Content-Type': \ 'application/x-www-form-urlencoded;charset=UTF-8'} def getAuthToken(self): tokenRes = requests.post(AUTH_URL, data = 'client_id=' + CLIENT_ID + \ '&client_secret=' + CLIENT_SECRET + '&grant_type=client_credentials', \ headers = self._headers) tokenResponse = json.loads(tokenRes.text) return tokenResponse['access_token'] class SSApi: def __init__(self, accessToken): self._accessToken = 'Bearer ' + accessToken self._ssApiUrl = SS_API_URL + SPREADSHEET_ID + "/sheets/" + SHEET_ID + "/values/A2:H" self._headers = {'Authorization': self._accessToken} def getRawData(self): dataRes = requests.get(self._ssApiUrl, headers = self._headers) # print(dataRes) rawData = json.loads(dataRes.text) # todo 处理分页 # print("---", rawData['data'][0]['values'][0]) return rawData['data'][0]['values'] def updateRange(self, sheetId, range, values): url = SS_API_URL + SPREADSHEET_ID + "/sheets/" + sheetId + "/values/" + range print("更新范围:", url) print("值:", values) dataRes = requests.put(url, headers = self._headers, \ data=json.dumps(values)) def write_tier_data(ssApi: SSApi): values = [] values.append([HELLO_WORLD]) ssApi.updateRange(SHEET_ID, 'A1:ZZZZ99', {"values": values}) def main(): authToken = ApiAuth().getAuthToken() ssApi = SSApi(authToken) # rawData = ssApi.getRawData() write_tier_data(ssApi) print('Calling main') main() - 请前往 这篇文章 ,并按照步骤从您的电子表格运行脚本。