為了展示 Workiva Scripting 如何在 Workiva 中運作,我們建立了一個簡單的腳本來更新電子表格中的一個單元格。您可以按照以下步驟在自己的工作區中複製該腳本。
註: 目前僅可透過 Customize Workiva 使用腳本。深入了解。
要求
- 您的工作區必須啟用 Workiva Scripting。進一步了解 Workiva Scripting。
- 創建或編輯腳本需要Script Editor 角色。
- 您必須產生相依性 ,才能直接從試算表執行此指令碼。這將包括與 Workiva Public APIs 互動所需的 "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.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 handle pagination # 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("Update Range: ", url) print("Values: ", 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() - 按一下「儲存」(Save)。
此時,您應該確保已經為此指令碼產生必要的相依性 。
執行腳本
要手動執行指令碼:
- 開啟指令碼後,按一下螢幕上方功能表列中的Run Script 。
- 輸入存取 Spreadsheets API 所需的參數、試算表和工作表 ID,以及儲存格的文字內容。點擊執行腳本 。
注意: ID 可在電子表格的 URL 中找到:/spreadsheet/{spreadsheetId}/sheet/{sheetId} 。
若要驗證腳本是否完成,請檢查電子表格中已更新的儲存格。
直接從試算表執行指令碼
透過使用automations ,也可以直接從試算表執行此指令碼及其他類似指令碼。
要使用自動化功能來使用此指令碼:
- 刪除現有的程式碼。
- 以下列程式碼取代:
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.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_SHEET_ID') INPUT_RESOURCE_ID = os.getenv('HELLO_ORLD')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 = "Holaaaaaaaaaaaa" 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 handle pagination # 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("Update Range: ", url) print("Values: ", 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() - 請前往這篇文章 ,並依照步驟從您的試算表執行腳本。