{ "cells": [ { "cell_type": "code", "id": "initial_id", "metadata": { "collapsed": true, "ExecuteTime": { "end_time": "2024-11-18T17:27:45.765230Z", "start_time": "2024-11-18T17:27:43.764041Z" } }, "source": [ "import pandas as pd\n", "from googleapiclient.errors import HttpError\n", "\n", "df = pd.read_excel('demo.xlsx')" ], "outputs": [], "execution_count": 2 }, { "metadata": { "ExecuteTime": { "end_time": "2024-11-18T18:29:32.919196Z", "start_time": "2024-11-18T18:29:32.841076Z" } }, "cell_type": "code", "source": "df", "id": "3fc9b282a2a5215d", "outputs": [ { "ename": "KeyError", "evalue": "'impression'", "output_type": "error", "traceback": [ "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", "\u001B[0;31mKeyError\u001B[0m Traceback (most recent call last)", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/indexes/base.py:3805\u001B[0m, in \u001B[0;36mIndex.get_loc\u001B[0;34m(self, key)\u001B[0m\n\u001B[1;32m 3804\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m-> 3805\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_engine\u001B[38;5;241m.\u001B[39mget_loc(casted_key)\n\u001B[1;32m 3806\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mKeyError\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m err:\n", "File \u001B[0;32mindex.pyx:167\u001B[0m, in \u001B[0;36mpandas._libs.index.IndexEngine.get_loc\u001B[0;34m()\u001B[0m\n", "File \u001B[0;32mindex.pyx:196\u001B[0m, in \u001B[0;36mpandas._libs.index.IndexEngine.get_loc\u001B[0;34m()\u001B[0m\n", "File \u001B[0;32mpandas/_libs/hashtable_class_helper.pxi:7081\u001B[0m, in \u001B[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001B[0;34m()\u001B[0m\n", "File \u001B[0;32mpandas/_libs/hashtable_class_helper.pxi:7089\u001B[0m, in \u001B[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001B[0;34m()\u001B[0m\n", "\u001B[0;31mKeyError\u001B[0m: 'impression'", "\nThe above exception was the direct cause of the following exception:\n", "\u001B[0;31mKeyError\u001B[0m Traceback (most recent call last)", "Cell \u001B[0;32mIn[21], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m df[\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mimpression\u001B[39m\u001B[38;5;124m'\u001B[39m] \u001B[38;5;241m=\u001B[39m df[\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mimpression\u001B[39m\u001B[38;5;124m'\u001B[39m]\u001B[38;5;241m.\u001B[39mstr\u001B[38;5;241m.\u001B[39mreplace(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124m,\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124m'\u001B[39m)\u001B[38;5;241m.\u001B[39mastype(\u001B[38;5;28mint\u001B[39m)\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/frame.py:4102\u001B[0m, in \u001B[0;36mDataFrame.__getitem__\u001B[0;34m(self, key)\u001B[0m\n\u001B[1;32m 4100\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mcolumns\u001B[38;5;241m.\u001B[39mnlevels \u001B[38;5;241m>\u001B[39m \u001B[38;5;241m1\u001B[39m:\n\u001B[1;32m 4101\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_getitem_multilevel(key)\n\u001B[0;32m-> 4102\u001B[0m indexer \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mcolumns\u001B[38;5;241m.\u001B[39mget_loc(key)\n\u001B[1;32m 4103\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m is_integer(indexer):\n\u001B[1;32m 4104\u001B[0m indexer \u001B[38;5;241m=\u001B[39m [indexer]\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/indexes/base.py:3812\u001B[0m, in \u001B[0;36mIndex.get_loc\u001B[0;34m(self, key)\u001B[0m\n\u001B[1;32m 3807\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(casted_key, \u001B[38;5;28mslice\u001B[39m) \u001B[38;5;129;01mor\u001B[39;00m (\n\u001B[1;32m 3808\u001B[0m \u001B[38;5;28misinstance\u001B[39m(casted_key, abc\u001B[38;5;241m.\u001B[39mIterable)\n\u001B[1;32m 3809\u001B[0m \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;28many\u001B[39m(\u001B[38;5;28misinstance\u001B[39m(x, \u001B[38;5;28mslice\u001B[39m) \u001B[38;5;28;01mfor\u001B[39;00m x \u001B[38;5;129;01min\u001B[39;00m casted_key)\n\u001B[1;32m 3810\u001B[0m ):\n\u001B[1;32m 3811\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m InvalidIndexError(key)\n\u001B[0;32m-> 3812\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mKeyError\u001B[39;00m(key) \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01merr\u001B[39;00m\n\u001B[1;32m 3813\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mTypeError\u001B[39;00m:\n\u001B[1;32m 3814\u001B[0m \u001B[38;5;66;03m# If we have a listlike key, _check_indexing_error will raise\u001B[39;00m\n\u001B[1;32m 3815\u001B[0m \u001B[38;5;66;03m# InvalidIndexError. Otherwise we fall through and re-raise\u001B[39;00m\n\u001B[1;32m 3816\u001B[0m \u001B[38;5;66;03m# the TypeError.\u001B[39;00m\n\u001B[1;32m 3817\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_check_indexing_error(key)\n", "\u001B[0;31mKeyError\u001B[0m: 'impression'" ] } ], "execution_count": 21 }, { "metadata": { "ExecuteTime": { "end_time": "2024-11-18T18:30:20.773902Z", "start_time": "2024-11-18T18:30:20.766806Z" } }, "cell_type": "code", "source": [ "# Grab the Column E\n", "impression_column = df.iloc[:, 4]\n", "total_impressions = impression_column[impression_column.shift(-1).isna()].iloc[0]\n", "\n", "total_impressions\n" ], "id": "76eb4775dda9b64c", "outputs": [ { "data": { "text/plain": [ "71796.3" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 23 }, { "metadata": { "ExecuteTime": { "end_time": "2024-11-18T17:35:53.956689Z", "start_time": "2024-11-18T17:35:53.939722Z" } }, "cell_type": "code", "source": "", "id": "388149da2aba2a39", "outputs": [ { "data": { "text/plain": [ " Addresses Sum of New Road Duration (Mins) \\\n", "27 Total 16041.4 \n", "30 Target (Total Campaigns) 144000 \n", "34 Target (Total Campaigns) 2400 \n", "45 Total 16041.4 \n", "52 Total 16041.4 \n", "59 Total 16041.4 \n", "65 Total 16041.4 \n", "73 Total 16041.4 \n", "80 Total 15180 \n", "88 Total 16041.4 \n", "93 Total 16041.4 \n", "\n", " Sum of New Road Duration (Hours) % Impression %.1 Unnamed: 6 \\\n", "27 267.4 100.0% 71796.3 100.0% NaN \n", "30 100% NaN NaN NaN NaN \n", "34 100 NaN NaN NaN NaN \n", "45 267.4 100.0% 71796.3 100.0% NaN \n", "52 267.4 100.0% 71796.3 100.0% NaN \n", "59 21915.9 115628 400% NaN Total \n", "65 267.4 100.0% 71796.3 100.0% NaN \n", "73 267.4 100.0% 71796.3 100.0% NaN \n", "80 253 100.0% 67497.1 100.0% NaN \n", "88 267.4 100.0% 71796.3 100.0% NaN \n", "93 267.4 100.0% 71796.3 100.0% NaN \n", "\n", " Addresses.1 Sum of Idle Final (Mins) Sum of Idle Final (Hours) %.2 \n", "27 Total 21915.9 365.3 100.0% \n", "30 Idle Time 21915.866667 NaN NaN \n", "34 NaN NaN NaN NaN \n", "45 Total 21915.9 365.3 100.0% \n", "52 Total 21915.9 365.3 100.0% \n", "59 16041.4 21915.9 115628 400% \n", "65 Total 21915.9 365.3 100.0% \n", "73 Total 21915.9 365.3 100.0% \n", "80 Total 21228.8 353.8 100.0% \n", "88 Total 21915.9 365.3 100.0% \n", "93 Total 21915.9 365.3 100.0% " ], "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AddressesSum of New Road Duration (Mins)Sum of New Road Duration (Hours)%Impression%.1Unnamed: 6Addresses.1Sum of Idle Final (Mins)Sum of Idle Final (Hours)%.2
27Total16041.4267.4100.0%71796.3100.0%NaNTotal21915.9365.3100.0%
30Target (Total Campaigns)144000100%NaNNaNNaNNaNIdle Time21915.866667NaNNaN
34Target (Total Campaigns)2400100NaNNaNNaNNaNNaNNaNNaNNaN
45Total16041.4267.4100.0%71796.3100.0%NaNTotal21915.9365.3100.0%
52Total16041.4267.4100.0%71796.3100.0%NaNTotal21915.9365.3100.0%
59Total16041.421915.9115628400%NaNTotal16041.421915.9115628400%
65Total16041.4267.4100.0%71796.3100.0%NaNTotal21915.9365.3100.0%
73Total16041.4267.4100.0%71796.3100.0%NaNTotal21915.9365.3100.0%
80Total15180253100.0%67497.1100.0%NaNTotal21228.8353.8100.0%
88Total16041.4267.4100.0%71796.3100.0%NaNTotal21915.9365.3100.0%
93Total16041.4267.4100.0%71796.3100.0%NaNTotal21915.9365.3100.0%
\n", "
" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 10 }, { "metadata": { "ExecuteTime": { "end_time": "2024-11-18T19:13:57.848911Z", "start_time": "2024-11-18T19:13:57.802866Z" } }, "cell_type": "code", "source": [ "from services import slides_service\n", "\n", "# presentation_id = \"1fgDkE5ODOQNQRMy71kiwvUJ4ZJ63DKncc2uDogyZgkM\"\n", "# presentation_id = \"1WK34qF2PsBqdHMt_OEi_C0veuXFXYUzSKP-_g0A6Mlw\"\n", "presentation_id = \"1rdL8zE2ayHtfPYeHf8KaBHWOD1hwgewfJrhhJYT9xik\"" ], "id": "7e4bdb4279ac698d", "outputs": [], "execution_count": 30 }, { "metadata": { "ExecuteTime": { "end_time": "2024-11-18T19:14:01.403646Z", "start_time": "2024-11-18T19:13:58.450554Z" } }, "cell_type": "code", "source": [ "try:\n", " # Fetch the presentation details\n", " presentation = slides_service.presentations().get(\n", " presentationId=presentation_id\n", " ).execute()\n", "\n", " # Prepare the batch update requests\n", " requests = []\n", "\n", " # Loop through slides and elements\n", " for slide in presentation.get(\"slides\", []):\n", " slide_id = slide.get(\"objectId\")\n", " print(f\"Processing Slide ID: {slide_id}\")\n", "\n", " for element in slide.get(\"pageElements\", []):\n", " element_id = element.get(\"objectId\")\n", "\n", " # Check if the element is a shape with text\n", " if \"shape\" in element and \"text\" in element[\"shape\"]:\n", " # Extract and log the text content\n", " text_elements = element[\"shape\"][\"text\"].get(\"textElements\", [])\n", " for text_element in text_elements:\n", " if \"textRun\" in text_element:\n", " text_content = text_element[\"textRun\"].get(\"content\", \"\").strip()\n", " print(f\"Text Content in Element ID {element_id}: '{text_content}'\")\n", "\n", " # Append request to replace text with objectId\n", " requests.append(\n", " {\n", " \"replaceAllText\": {\n", " \"containsText\": {\n", " \"text\": \"{{ANY_TEXT}}\", # Match all text\n", " \"matchCase\": False\n", " },\n", " \"replaceText\": element_id\n", " }\n", " }\n", " )\n", "\n", " # Execute the batch update to replace all text\n", " if requests:\n", " response = slides_service.presentations().batchUpdate(\n", " presentationId = presentation_id,\n", " body={\"requests\": requests}\n", " ).execute()\n", " print(\"All text boxes have been updated with their object IDs.\")\n", " # return response\n", " else:\n", " print(\"No text boxes found to update.\")\n", "\n", "except HttpError as error:\n", " print(f\"An error occurred: {error}\")\n", " # return None\n" ], "id": "df746ccfb11247ed", "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Processing Slide ID: g1b8874900bb_0_309\n", "Text Content in Element ID g1b8874900bb_0_312: 'campaign report'\n", "Text Content in Element ID g1b8874900bb_0_316: 'Aegis'\n", "Text Content in Element ID g1b8874900bb_0_316: ''\n", "Text Content in Element ID g1b8874900bb_0_317: 'brand • entice • inspire'\n", "Text Content in Element ID g1b8874900bb_0_318: 'prepared for:'\n", "Processing Slide ID: g1b8874900bb_0_322\n", "Text Content in Element ID g1b8874900bb_0_326: 'carching.co'\n", "Text Content in Element ID g1b8874900bb_0_327: 'brand • entice • inspire'\n", "Text Content in Element ID g1b8874900bb_0_328: '428.5k'\n", "Text Content in Element ID g1b8874900bb_0_328: ''\n", "Text Content in Element ID g1b8874900bb_0_330: 'Impressions'\n", "Text Content in Element ID g1b8874900bb_0_331: '12.9k'\n", "Text Content in Element ID g1b8874900bb_0_331: 'km'\n", "Text Content in Element ID g1b8874900bb_0_331: ''\n", "Text Content in Element ID g1b8874900bb_0_333: 'Distance Travelled'\n", "Text Content in Element ID g1b8874900bb_0_334: '745.0'\n", "Text Content in Element ID g1b8874900bb_0_334: 'hrs'\n", "Text Content in Element ID g1b8874900bb_0_336: 'On the road'\n", "Text Content in Element ID g1b8874900bb_0_338: 'Normal Traffic Hours'\n", "Text Content in Element ID g1b8874900bb_0_339: 'High Traffic Hours'\n", "Text Content in Element ID g1b8874900bb_0_345: 'Traffic Conditions'\n", "Text Content in Element ID g1b8874900bb_0_346: 'campaign report'\n", "Text Content in Element ID g1b8874900bb_0_346: ''\n", "Text Content in Element ID g1b8874900bb_0_347: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Text Content in Element ID g1b8874900bb_0_349: 'Actual vs Target'\n", "Text Content in Element ID g1b8874900bb_0_353: 'Target'\n", "Text Content in Element ID g1b8874900bb_0_360: 'Actual'\n", "Text Content in Element ID g1b8874900bb_0_360: ''\n", "Text Content in Element ID g1b8874900bb_0_363: 'Expected'\n", "Text Content in Element ID g1b8874900bb_0_363: ''\n", "Text Content in Element ID g1b8874900bb_0_364: 'Actual'\n", "Text Content in Element ID g1b8874900bb_0_364: ''\n", "Text Content in Element ID g1b8874900bb_0_370: 'Snapshot View'\n", "Text Content in Element ID g262113f74d0_0_8: '100.0%'\n", "Text Content in Element ID g262113f74d0_0_11: '8,000'\n", "Text Content in Element ID g262113f74d0_0_14: '12,928'\n", "Text Content in Element ID g2a5ce336bbf_2_4: '59.3%'\n", "Text Content in Element ID g2a5ce336bbf_2_3: '40.7%'\n", "Text Content in Element ID g2db018aecc0_0_666: '101.1%'\n", "Processing Slide ID: g262113f74d0_0_18\n", "Text Content in Element ID g262113f74d0_0_21: 'carching.co'\n", "Text Content in Element ID g262113f74d0_0_23: 'brand • entice • inspire'\n", "Text Content in Element ID g2a5ce336bbf_2_8: 'campaign report'\n", "Text Content in Element ID g2a5ce336bbf_2_8: ''\n", "Text Content in Element ID g2a5ce336bbf_2_12: 'Weekly Performance'\n", "Text Content in Element ID g2642f480c6f_0_2: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g1b91d712432_0_88\n", "Text Content in Element ID g1b91d712432_0_91: 'carching.co'\n", "Text Content in Element ID g1b91d712432_0_93: 'brand • entice • inspire'\n", "Text Content in Element ID g2a5ce336bbf_2_21: 'campaign report'\n", "Text Content in Element ID g2a5ce336bbf_2_21: ''\n", "Text Content in Element ID g2a5ce336bbf_2_23: 'Aggregate Performance'\n", "Text Content in Element ID g2642f480c6f_0_3: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g1b8874900bb_0_388\n", "Text Content in Element ID g1b8874900bb_0_391: 'carching.co'\n", "Text Content in Element ID g1b8874900bb_0_392: 'brand • entice • inspire'\n", "Text Content in Element ID g1b8874900bb_0_393: '% Road Types'\n", "Text Content in Element ID g1b8874900bb_0_394: '% Areas'\n", "Text Content in Element ID g1b8874900bb_0_395: '% Days of the Week'\n", "Text Content in Element ID g1b8874900bb_0_397: 'Analysis of Drivers on the Road (by duration)'\n", "Text Content in Element ID g1b8874900bb_0_401: 'Main Road'\n", "Text Content in Element ID g1b8874900bb_0_401: '- 125k imp'\n", "Text Content in Element ID g1b8874900bb_0_402: 'Highway'\n", "Text Content in Element ID g1b8874900bb_0_402: '- 96.6k imp'\n", "Text Content in Element ID g1b8874900bb_0_403: 'Housing Area'\n", "Text Content in Element ID g1b8874900bb_0_403: '- 12.57k imp'\n", "Text Content in Element ID g1b8874900bb_0_404: 'Shoplot'\n", "Text Content in Element ID g1b8874900bb_0_404: '- 92k imp'\n", "Text Content in Element ID g1b8874900bb_0_415: 'Seputeh'\n", "Text Content in Element ID g1b8874900bb_0_415: '- 12.10k imp'\n", "Text Content in Element ID g2a5ce336bbf_2_29: 'campaign report'\n", "Text Content in Element ID g2a5ce336bbf_2_29: ''\n", "Text Content in Element ID g2a5ce336bbf_2_112: 'Bangi'\n", "Text Content in Element ID g2a5ce336bbf_2_112: '- 10.20k imp'\n", "Text Content in Element ID g2a5ce336bbf_2_114: 'Sepang'\n", "Text Content in Element ID g2a5ce336bbf_2_114: '- 8.30k imp'\n", "Text Content in Element ID g2a5ce336bbf_2_118: 'Puchong'\n", "Text Content in Element ID g2a5ce336bbf_2_118: '- 3.50k imp'\n", "Text Content in Element ID g2a5ce336bbf_2_120: 'Klang'\n", "Text Content in Element ID g2a5ce336bbf_2_120: '- 2.90k imp'\n", "Text Content in Element ID g2642f480c6f_0_4: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Text Content in Element ID g2642f480c6f_0_34: 'Petaling Jaya'\n", "Text Content in Element ID g2642f480c6f_0_34: '- 5.60k imp'\n", "Text Content in Element ID g2db018aecc0_0_678: 'Kota Raja'\n", "Text Content in Element ID g2db018aecc0_0_678: '- 6.20k imp'\n", "Text Content in Element ID g2db018aecc0_0_679: 'Segambut'\n", "Text Content in Element ID g2db018aecc0_0_679: '- 4.30k imp'\n", "Text Content in Element ID g2db018aecc0_0_680: 'Bdr T Razak'\n", "Text Content in Element ID g2db018aecc0_0_680: '- 3.70k imp'\n", "Text Content in Element ID g2db018aecc0_0_680: ''\n", "Text Content in Element ID g2db018aecc0_0_682: 'Others'\n", "Text Content in Element ID g2db018aecc0_0_682: '- 9.60k imp'\n", "Text Content in Element ID g2dae0ceb7ee_0_23: 'Lembah Pantai'\n", "Text Content in Element ID g2dae0ceb7ee_0_23: '- 2.40 imp'\n", "Text Content in Element ID g2dae0ceb7ee_0_24: 'Shah Alam'\n", "Text Content in Element ID g2dae0ceb7ee_0_24: '- 3.00k imp'\n", "Text Content in Element ID g2dae0ceb7ee_0_25: 'Batu'\n", "Text Content in Element ID g2dae0ceb7ee_0_25: '- 2.10k imp'\n", "Text Content in Element ID g2dae0ceb7ee_0_26: 'Cheras'\n", "Text Content in Element ID g2dae0ceb7ee_0_26: '- 2.60k imp'\n", "Text Content in Element ID g2dae0ceb7ee_0_28: 'Kapar'\n", "Text Content in Element ID g2dae0ceb7ee_0_28: '- 1.90k imp'\n", "Text Content in Element ID g2dae0ceb7ee_0_29: 'Damansara'\n", "Text Content in Element ID g2dae0ceb7ee_0_29: '- 2.10k imp'\n", "Text Content in Element ID g2df79a93bfa_0_1: 'Gombak'\n", "Text Content in Element ID g2df79a93bfa_0_1: '- 4.70 imp'\n", "Text Content in Element ID g2df79a93bfa_0_2: 'Bukit Bintang'\n", "Text Content in Element ID g2df79a93bfa_0_2: '- 5.40 imp'\n", "Text Content in Element ID g2df79a93bfa_0_10: 'Subang'\n", "Text Content in Element ID g2df79a93bfa_0_10: '- 5.20k imp'\n", "Text Content in Element ID g2df79a93bfa_0_10: ''\n", "Text Content in Element ID g2df79a93bfa_0_13: 'Kuala Langat'\n", "Text Content in Element ID g2df79a93bfa_0_13: '- 4.30 imp'\n", "Processing Slide ID: g1bc78aaac68_1_11\n", "Text Content in Element ID g1bc78aaac68_1_16: 'carching.co'\n", "Text Content in Element ID g1bc78aaac68_1_17: 'brand • entice • inspire'\n", "Text Content in Element ID g2a5ce336bbf_2_37: 'campaign report'\n", "Text Content in Element ID g2a5ce336bbf_2_37: ''\n", "Text Content in Element ID g2a5ce336bbf_2_79: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Text Content in Element ID g2a5ce336bbf_2_89: 'Heatmap of Frequency of Areas Covered'\n", "Text Content in Element ID g2a5ce336bbf_2_89: ''\n", "Processing Slide ID: g1b8874900bb_0_426\n", "Text Content in Element ID g1b8874900bb_0_429: 'carching.co'\n", "Text Content in Element ID g1b8874900bb_0_430: 'brand • entice • inspire'\n", "Text Content in Element ID g1b8874900bb_0_431: 'Total impressions'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'generated'\n", "Text Content in Element ID g1b8874900bb_0_431: ':'\n", "Text Content in Element ID g1b8874900bb_0_431: '428,487'\n", "Text Content in Element ID g1b8874900bb_0_431: '–'\n", "Text Content in Element ID g1b8874900bb_0_431: 'surpassing expected by 10.07%'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'Total distance'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'travelled'\n", "Text Content in Element ID g1b8874900bb_0_431: ':'\n", "Text Content in Element ID g1b8874900bb_0_431: '12,928 km'\n", "Text Content in Element ID g1b8874900bb_0_431: '–'\n", "Text Content in Element ID g1b8874900bb_0_431: 'surpassing target by 61.6%'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'Average distance'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'covered by carching driver'\n", "Text Content in Element ID g1b8874900bb_0_431: ':'\n", "Text Content in Element ID g1b8874900bb_0_431: '1,292.7 km per month'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'Total hours'\n", "Text Content in Element ID g1b8874900bb_0_431: 'carching drivers spend driving'\n", "Text Content in Element ID g1b8874900bb_0_431: ':'\n", "Text Content in Element ID g1b8874900bb_0_431: '745.0 hours'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'Most hours'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'spent in traffic'\n", "Text Content in Element ID g1b8874900bb_0_431: ':'\n", "Text Content in Element ID g1b8874900bb_0_431: 'Skewed towards'\n", "Text Content in Element ID g1b8874900bb_0_431: 'Normal Traffic Hours'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'Frequent areas'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'covered'\n", "Text Content in Element ID g1b8874900bb_0_431: ':'\n", "Text Content in Element ID g1b8874900bb_0_431: 'Bangi, Subang,'\n", "Text Content in Element ID g1b8874900bb_0_431: 'and'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'Seputeh'\n", "Text Content in Element ID g1b8874900bb_0_431: 'Frequent roads'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'covered'\n", "Text Content in Element ID g1b8874900bb_0_431: ':'\n", "Text Content in Element ID g1b8874900bb_0_431: '37.2% of the time'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'on the road were spent on'\n", "Text Content in Element ID g1b8874900bb_0_431: 'Main Road'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'Most active days'\n", "Text Content in Element ID g1b8874900bb_0_431: ''\n", "Text Content in Element ID g1b8874900bb_0_431: 'in a week\t\t\t :'\n", "Text Content in Element ID g1b8874900bb_0_431: 'Wednesday,'\n", "Text Content in Element ID g1b8874900bb_0_431: 'followed by'\n", "Text Content in Element ID g1b8874900bb_0_431: 'Tuesday'\n", "Text Content in Element ID g2a5ce336bbf_2_61: 'campaign summary'\n", "Text Content in Element ID g2a5ce336bbf_2_61: ''\n", "Text Content in Element ID g2a5ce336bbf_2_93: 'Key Highlights'\n", "Text Content in Element ID g2b0be626c1f_0_9: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2db018aecc0_0_73\n", "Text Content in Element ID g2db018aecc0_0_76: 'carching.co'\n", "Text Content in Element ID g2db018aecc0_0_77: 'brand • entice • inspire'\n", "Text Content in Element ID g2db018aecc0_0_78: 'campaign fulfilment'\n", "Text Content in Element ID g2db018aecc0_0_78: ''\n", "Text Content in Element ID g2db018aecc0_0_80: 'Campaign Car Images'\n", "Text Content in Element ID g2db018aecc0_0_81: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2db018aecc0_0_132\n", "Text Content in Element ID g2db018aecc0_0_135: 'carching.co'\n", "Text Content in Element ID g2db018aecc0_0_136: 'brand • entice • inspire'\n", "Text Content in Element ID g2db018aecc0_0_137: 'campaign fulfilment'\n", "Text Content in Element ID g2db018aecc0_0_137: ''\n", "Text Content in Element ID g2db018aecc0_0_139: 'Campaign Car Images'\n", "Text Content in Element ID g2db018aecc0_0_140: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2db018aecc0_0_191\n", "Text Content in Element ID g2db018aecc0_0_194: 'carching.co'\n", "Text Content in Element ID g2db018aecc0_0_195: 'brand • entice • inspire'\n", "Text Content in Element ID g2db018aecc0_0_196: 'campaign fulfilment'\n", "Text Content in Element ID g2db018aecc0_0_196: ''\n", "Text Content in Element ID g2db018aecc0_0_198: 'Campaign Car Images'\n", "Text Content in Element ID g2db018aecc0_0_199: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2db018aecc0_0_250\n", "Text Content in Element ID g2db018aecc0_0_253: 'carching.co'\n", "Text Content in Element ID g2db018aecc0_0_254: 'brand • entice • inspire'\n", "Text Content in Element ID g2db018aecc0_0_255: 'campaign fulfilment'\n", "Text Content in Element ID g2db018aecc0_0_255: ''\n", "Text Content in Element ID g2db018aecc0_0_257: 'Campaign Car Images'\n", "Text Content in Element ID g2db018aecc0_0_258: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2db018aecc0_0_309\n", "Text Content in Element ID g2db018aecc0_0_312: 'carching.co'\n", "Text Content in Element ID g2db018aecc0_0_313: 'brand • entice • inspire'\n", "Text Content in Element ID g2db018aecc0_0_314: 'campaign fulfilment'\n", "Text Content in Element ID g2db018aecc0_0_314: ''\n", "Text Content in Element ID g2db018aecc0_0_316: 'Campaign Car Images'\n", "Text Content in Element ID g2db018aecc0_0_317: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2db018aecc0_0_368\n", "Text Content in Element ID g2db018aecc0_0_371: 'carching.co'\n", "Text Content in Element ID g2db018aecc0_0_372: 'brand • entice • inspire'\n", "Text Content in Element ID g2db018aecc0_0_373: 'campaign fulfilment'\n", "Text Content in Element ID g2db018aecc0_0_373: ''\n", "Text Content in Element ID g2db018aecc0_0_375: 'Campaign Car Images'\n", "Text Content in Element ID g2db018aecc0_0_376: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2db018aecc0_0_427\n", "Text Content in Element ID g2db018aecc0_0_430: 'carching.co'\n", "Text Content in Element ID g2db018aecc0_0_431: 'brand • entice • inspire'\n", "Text Content in Element ID g2db018aecc0_0_432: 'campaign fulfilment'\n", "Text Content in Element ID g2db018aecc0_0_432: ''\n", "Text Content in Element ID g2db018aecc0_0_434: 'Campaign Car Images'\n", "Text Content in Element ID g2db018aecc0_0_435: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2db018aecc0_0_486\n", "Text Content in Element ID g2db018aecc0_0_489: 'carching.co'\n", "Text Content in Element ID g2db018aecc0_0_490: 'brand • entice • inspire'\n", "Text Content in Element ID g2db018aecc0_0_491: 'campaign fulfilment'\n", "Text Content in Element ID g2db018aecc0_0_491: ''\n", "Text Content in Element ID g2db018aecc0_0_493: 'Campaign Car Images'\n", "Text Content in Element ID g2db018aecc0_0_494: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2db018aecc0_0_545\n", "Text Content in Element ID g2db018aecc0_0_548: 'carching.co'\n", "Text Content in Element ID g2db018aecc0_0_549: 'brand • entice • inspire'\n", "Text Content in Element ID g2db018aecc0_0_550: 'campaign fulfilment'\n", "Text Content in Element ID g2db018aecc0_0_550: ''\n", "Text Content in Element ID g2db018aecc0_0_552: 'Campaign Car Images'\n", "Text Content in Element ID g2db018aecc0_0_553: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2db018aecc0_0_604\n", "Text Content in Element ID g2db018aecc0_0_607: 'carching.co'\n", "Text Content in Element ID g2db018aecc0_0_608: 'brand • entice • inspire'\n", "Text Content in Element ID g2db018aecc0_0_609: 'campaign fulfilment'\n", "Text Content in Element ID g2db018aecc0_0_609: ''\n", "Text Content in Element ID g2db018aecc0_0_611: 'Campaign Car Images'\n", "Text Content in Element ID g2db018aecc0_0_612: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2df79a93bfa_0_24\n", "Text Content in Element ID g2df79a93bfa_0_27: 'carching.co'\n", "Text Content in Element ID g2df79a93bfa_0_28: 'brand • entice • inspire'\n", "Text Content in Element ID g2df79a93bfa_0_29: 'campaign event'\n", "Text Content in Element ID g2df79a93bfa_0_29: ''\n", "Text Content in Element ID g2df79a93bfa_0_31: 'Campaign Event Images'\n", "Text Content in Element ID g2df79a93bfa_0_32: 'Reporting period: 21 Mar - 05 Apr 2024'\n", "Processing Slide ID: g2df79a93bfa_0_83\n", "Text Content in Element ID g2df79a93bfa_0_86: 'carching.co'\n", "Text Content in Element ID g2df79a93bfa_0_87: 'brand • entice • inspire'\n", "Text Content in Element ID g2df79a93bfa_0_88: 'campaign event'\n", "Text Content in Element ID g2df79a93bfa_0_88: ''\n", "Text Content in Element ID g2df79a93bfa_0_90: 'Campaign Event Images'\n", "Text Content in Element ID g2df79a93bfa_0_91: 'Reporting period: 21 Mar - 05 Apr 2024'\n", "Processing Slide ID: g2dae0ceb7ee_0_36\n", "Text Content in Element ID g2dae0ceb7ee_0_37: ''\n", "Text Content in Element ID g2dae0ceb7ee_0_41: 'carching.co'\n", "Text Content in Element ID g2dae0ceb7ee_0_42: 'brand • entice • inspire'\n", "Text Content in Element ID g2dae0ceb7ee_0_46: 'campaign drivers'\n", "Text Content in Element ID g2dae0ceb7ee_0_47: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g1b8874900bb_0_491\n", "Text Content in Element ID g1b8874900bb_0_494: 'carching.co'\n", "Text Content in Element ID g1b8874900bb_0_495: 'brand • entice • inspire'\n", "Text Content in Element ID g2a5ce336bbf_2_97: 'glossary'\n", "Text Content in Element ID g2a5ce336bbf_2_97: ''\n", "Text Content in Element ID g2b0be626c1f_0_17: 'Reporting period: 21 Mar - 29 Apr 2024'\n", "Processing Slide ID: g2db018aecc0_0_12\n", "Text Content in Element ID g2db018aecc0_0_15: 'let’s chat'\n", "Text Content in Element ID g2db018aecc0_0_17: 'CEO'\n", "Text Content in Element ID g2db018aecc0_0_18: 'jeshua choong'\n", "Text Content in Element ID g2db018aecc0_0_19: '+6016 615 5847'\n", "Text Content in Element ID g2db018aecc0_0_19: 'jeshua@carching.co'\n", "Text Content in Element ID g2db018aecc0_0_20: 'carching.co'\n", "Text Content in Element ID g2db018aecc0_0_21: 'brand • entice • inspire'\n", "Text Content in Element ID g2db018aecc0_0_23: 'farra natasya'\n", "Text Content in Element ID g2db018aecc0_0_23: ''\n", "Text Content in Element ID g2db018aecc0_0_24: '+6018 669 5384'\n", "Text Content in Element ID g2db018aecc0_0_24: 'farra@carching.co'\n", "Text Content in Element ID g2db018aecc0_0_25: 'Business Development'\n", "Text Content in Element ID g2db018aecc0_0_25: ''\n", "Processing Slide ID: g1b8874900bb_0_519\n", "Text Content in Element ID g1b8874900bb_0_523: 'www.'\n", "Text Content in Element ID g1b8874900bb_0_523: 'carching.co'\n", "Text Content in Element ID g1b8874900bb_0_524: 'beep@carching.co'\n", "Text Content in Element ID g1b8874900bb_0_525: '//'\n", "All text boxes have been updated with their object IDs.\n" ] } ], "execution_count": 31 }, { "metadata": { "ExecuteTime": { "end_time": "2024-11-18T19:54:04.870419Z", "start_time": "2024-11-18T19:54:04.861074Z" } }, "cell_type": "code", "source": [ "# g1b8874900bb_0_328\n", "\n", "# g1b8874900bb_0_431" ], "id": "2ccd27e09c5fdfaa", "outputs": [], "execution_count": 32 }, { "metadata": { "ExecuteTime": { "end_time": "2024-11-18T19:56:52.687860Z", "start_time": "2024-11-18T19:56:52.669573Z" } }, "cell_type": "code", "source": "from services import slides_service, sheets_service, drive_service", "id": "9400ee6e2759ac5", "outputs": [], "execution_count": 33 }, { "metadata": { "ExecuteTime": { "end_time": "2024-11-18T19:59:22.153724Z", "start_time": "2024-11-18T19:59:16.529074Z" } }, "cell_type": "code", "source": [ "# Step 1: Create a Spreadsheet with Data\n", "spreadsheet_body = {\n", " \"properties\": {\"title\": \"Actual vs Target Data\"}\n", "}\n", "spreadsheet = sheets_service.spreadsheets().create(body=spreadsheet_body).execute()\n", "spreadsheet_id = spreadsheet['spreadsheetId']\n", "print(f\"Spreadsheet ID: {spreadsheet_id}\")\n", "\n", "# Populate with Data\n", "data = [\n", " [\"Metric\", \"Value\"],\n", " [\"Expected\", 100.0],\n", " [\"Actual\", 101.1],\n", "]\n", "data_range = \"Sheet1!A1:B3\"\n", "value_range_body = {\"values\": data}\n", "sheets_service.spreadsheets().values().update(\n", " spreadsheetId=spreadsheet_id,\n", " range=data_range,\n", " valueInputOption=\"RAW\",\n", " body=value_range_body\n", ").execute()\n", "\n", "# Step 2: Add a Horizontal Bar Chart\n", "chart_body = {\n", " \"requests\": [\n", " {\n", " \"addChart\": {\n", " \"chart\": {\n", " \"spec\": {\n", " \"title\": \"Actual vs Target\",\n", " \"basicChart\": {\n", " \"chartType\": \"BAR\",\n", " \"legendPosition\": \"BOTTOM_LEGEND\",\n", " \"axis\": [\n", " {\"position\": \"BOTTOM_AXIS\", \"title\": \"Percentage\"},\n", " {\"position\": \"LEFT_AXIS\", \"title\": \"Metric\"},\n", " ],\n", " \"domains\": [\n", " {\n", " \"domain\": {\n", " \"sourceRange\": {\n", " \"sources\": [\n", " {\n", " \"sheetId\": 0,\n", " \"startRowIndex\": 1,\n", " \"endRowIndex\": 3,\n", " \"startColumnIndex\": 0,\n", " \"endColumnIndex\": 1,\n", " }\n", " ]\n", " }\n", " }\n", " }\n", " ],\n", " \"series\": [\n", " {\n", " \"series\": {\n", " \"sourceRange\": {\n", " \"sources\": [\n", " {\n", " \"sheetId\": 0,\n", " \"startRowIndex\": 1,\n", " \"endRowIndex\": 3,\n", " \"startColumnIndex\": 1,\n", " \"endColumnIndex\": 2,\n", " }\n", " ]\n", " }\n", " },\n", " \"targetAxis\": \"BOTTOM_AXIS\",\n", " }\n", " ],\n", " \"stackedType\": \"STACKED\",\n", " },\n", " },\n", " \"position\": {\"overlayPosition\": {}},\n", " }\n", " }\n", " }\n", " ]\n", "}\n", "\n", "sheets_service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body=chart_body).execute()\n", "print(\"Chart created in Google Sheets\")\n", "\n", "# Step 3: Create a Google Slide Presentation\n", "presentation = slides_service.presentations().create(body={\"title\": \"Actual vs Target Chart\"}).execute()\n", "presentation_id = presentation['presentationId']\n", "print(f\"Presentation ID: {presentation_id}\")\n", "\n", "# Step 4: Embed Chart into Google Slides\n", "slide_id = slides_service.presentations().pages().create(\n", " presentationId=presentation_id,\n", " body={\"slideLayoutReference\": {\"predefinedLayout\": \"BLANK\"}}\n", ").execute()[\"objectId\"]\n", "\n", "embedded_chart_request = {\n", " \"requests\": [\n", " {\n", " \"createSheetsChart\": {\n", " \"objectId\": \"ChartObjectID\",\n", " \"spreadsheetId\": spreadsheet_id,\n", " \"chartId\": 1, # First chart added to spreadsheet\n", " \"linkingMode\": \"LINKED\",\n", " \"elementProperties\": {\n", " \"pageObjectId\": slide_id,\n", " \"size\": {\n", " \"height\": {\"magnitude\": 4000000, \"unit\": \"EMU\"},\n", " \"width\": {\"magnitude\": 6000000, \"unit\": \"EMU\"},\n", " },\n", " \"transform\": {\n", " \"scaleX\": 1,\n", " \"scaleY\": 1,\n", " \"translateX\": 1000000,\n", " \"translateY\": 1000000,\n", " \"unit\": \"EMU\",\n", " },\n", " },\n", " }\n", " }\n", " ]\n", "}\n", "\n", "slides_service.presentations().batchUpdate(\n", " presentationId=presentation_id, body=embedded_chart_request\n", ").execute()\n", "print(f\"Chart added to Google Slides presentation {presentation_id}\")\n" ], "id": "753beb465e23c43b", "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Spreadsheet ID: 1TNbkbcuGN4xUgi-TxVkPPyBKc0JM-_5A8Si_GDtgK60\n", "Chart created in Google Sheets\n" ] }, { "ename": "SSLEOFError", "evalue": "EOF occurred in violation of protocol (_ssl.c:2427)", "output_type": "error", "traceback": [ "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", "\u001B[0;31mSSLEOFError\u001B[0m Traceback (most recent call last)", "Cell \u001B[0;32mIn[35], line 88\u001B[0m\n\u001B[1;32m 85\u001B[0m \u001B[38;5;28mprint\u001B[39m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mChart created in Google Sheets\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[1;32m 87\u001B[0m \u001B[38;5;66;03m# Step 3: Create a Google Slide Presentation\u001B[39;00m\n\u001B[0;32m---> 88\u001B[0m presentation \u001B[38;5;241m=\u001B[39m slides_service\u001B[38;5;241m.\u001B[39mpresentations()\u001B[38;5;241m.\u001B[39mcreate(body\u001B[38;5;241m=\u001B[39m{\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mtitle\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mActual vs Target Chart\u001B[39m\u001B[38;5;124m\"\u001B[39m})\u001B[38;5;241m.\u001B[39mexecute()\n\u001B[1;32m 89\u001B[0m presentation_id \u001B[38;5;241m=\u001B[39m presentation[\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mpresentationId\u001B[39m\u001B[38;5;124m'\u001B[39m]\n\u001B[1;32m 90\u001B[0m \u001B[38;5;28mprint\u001B[39m(\u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mPresentation ID: \u001B[39m\u001B[38;5;132;01m{\u001B[39;00mpresentation_id\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m)\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/site-packages/googleapiclient/_helpers.py:130\u001B[0m, in \u001B[0;36mpositional..positional_decorator..positional_wrapper\u001B[0;34m(*args, **kwargs)\u001B[0m\n\u001B[1;32m 128\u001B[0m \u001B[38;5;28;01melif\u001B[39;00m positional_parameters_enforcement \u001B[38;5;241m==\u001B[39m POSITIONAL_WARNING:\n\u001B[1;32m 129\u001B[0m logger\u001B[38;5;241m.\u001B[39mwarning(message)\n\u001B[0;32m--> 130\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m wrapped(\u001B[38;5;241m*\u001B[39margs, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/site-packages/googleapiclient/http.py:923\u001B[0m, in \u001B[0;36mHttpRequest.execute\u001B[0;34m(self, http, num_retries)\u001B[0m\n\u001B[1;32m 920\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mheaders[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcontent-length\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mstr\u001B[39m(\u001B[38;5;28mlen\u001B[39m(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mbody))\n\u001B[1;32m 922\u001B[0m \u001B[38;5;66;03m# Handle retries for server-side errors.\u001B[39;00m\n\u001B[0;32m--> 923\u001B[0m resp, content \u001B[38;5;241m=\u001B[39m _retry_request(\n\u001B[1;32m 924\u001B[0m http,\n\u001B[1;32m 925\u001B[0m num_retries,\n\u001B[1;32m 926\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mrequest\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[1;32m 927\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_sleep,\n\u001B[1;32m 928\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_rand,\n\u001B[1;32m 929\u001B[0m \u001B[38;5;28mstr\u001B[39m(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39muri),\n\u001B[1;32m 930\u001B[0m method\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mstr\u001B[39m(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mmethod),\n\u001B[1;32m 931\u001B[0m body\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mbody,\n\u001B[1;32m 932\u001B[0m headers\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mheaders,\n\u001B[1;32m 933\u001B[0m )\n\u001B[1;32m 935\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m callback \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mresponse_callbacks:\n\u001B[1;32m 936\u001B[0m callback(resp)\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/site-packages/googleapiclient/http.py:222\u001B[0m, in \u001B[0;36m_retry_request\u001B[0;34m(http, num_retries, req_type, sleep, rand, uri, method, *args, **kwargs)\u001B[0m\n\u001B[1;32m 220\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m exception:\n\u001B[1;32m 221\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m retry_num \u001B[38;5;241m==\u001B[39m num_retries:\n\u001B[0;32m--> 222\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m exception\n\u001B[1;32m 223\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m 224\u001B[0m \u001B[38;5;28;01mcontinue\u001B[39;00m\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/site-packages/googleapiclient/http.py:191\u001B[0m, in \u001B[0;36m_retry_request\u001B[0;34m(http, num_retries, req_type, sleep, rand, uri, method, *args, **kwargs)\u001B[0m\n\u001B[1;32m 189\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m 190\u001B[0m exception \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m--> 191\u001B[0m resp, content \u001B[38;5;241m=\u001B[39m http\u001B[38;5;241m.\u001B[39mrequest(uri, method, \u001B[38;5;241m*\u001B[39margs, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[1;32m 192\u001B[0m \u001B[38;5;66;03m# Retry on SSL errors and socket timeout errors.\u001B[39;00m\n\u001B[1;32m 193\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m _ssl_SSLError \u001B[38;5;28;01mas\u001B[39;00m ssl_error:\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/site-packages/google_auth_httplib2.py:218\u001B[0m, in \u001B[0;36mAuthorizedHttp.request\u001B[0;34m(self, uri, method, body, headers, redirections, connection_type, **kwargs)\u001B[0m\n\u001B[1;32m 215\u001B[0m body_stream_position \u001B[38;5;241m=\u001B[39m body\u001B[38;5;241m.\u001B[39mtell()\n\u001B[1;32m 217\u001B[0m \u001B[38;5;66;03m# Make the request.\u001B[39;00m\n\u001B[0;32m--> 218\u001B[0m response, content \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mhttp\u001B[38;5;241m.\u001B[39mrequest(\n\u001B[1;32m 219\u001B[0m uri,\n\u001B[1;32m 220\u001B[0m method,\n\u001B[1;32m 221\u001B[0m body\u001B[38;5;241m=\u001B[39mbody,\n\u001B[1;32m 222\u001B[0m headers\u001B[38;5;241m=\u001B[39mrequest_headers,\n\u001B[1;32m 223\u001B[0m redirections\u001B[38;5;241m=\u001B[39mredirections,\n\u001B[1;32m 224\u001B[0m connection_type\u001B[38;5;241m=\u001B[39mconnection_type,\n\u001B[1;32m 225\u001B[0m \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs\n\u001B[1;32m 226\u001B[0m )\n\u001B[1;32m 228\u001B[0m \u001B[38;5;66;03m# If the response indicated that the credentials needed to be\u001B[39;00m\n\u001B[1;32m 229\u001B[0m \u001B[38;5;66;03m# refreshed, then refresh the credentials and re-attempt the\u001B[39;00m\n\u001B[1;32m 230\u001B[0m \u001B[38;5;66;03m# request.\u001B[39;00m\n\u001B[1;32m 231\u001B[0m \u001B[38;5;66;03m# A stored token may expire between the time it is retrieved and\u001B[39;00m\n\u001B[1;32m 232\u001B[0m \u001B[38;5;66;03m# the time the request is made, so we may need to try twice.\u001B[39;00m\n\u001B[1;32m 233\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m (\n\u001B[1;32m 234\u001B[0m response\u001B[38;5;241m.\u001B[39mstatus \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_refresh_status_codes\n\u001B[1;32m 235\u001B[0m \u001B[38;5;129;01mand\u001B[39;00m _credential_refresh_attempt \u001B[38;5;241m<\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_max_refresh_attempts\n\u001B[1;32m 236\u001B[0m ):\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/site-packages/httplib2/__init__.py:1724\u001B[0m, in \u001B[0;36mHttp.request\u001B[0;34m(self, uri, method, body, headers, redirections, connection_type)\u001B[0m\n\u001B[1;32m 1722\u001B[0m content \u001B[38;5;241m=\u001B[39m \u001B[38;5;124mb\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[1;32m 1723\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m-> 1724\u001B[0m (response, content) \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_request(\n\u001B[1;32m 1725\u001B[0m conn, authority, uri, request_uri, method, body, headers, redirections, cachekey,\n\u001B[1;32m 1726\u001B[0m )\n\u001B[1;32m 1727\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[1;32m 1728\u001B[0m is_timeout \u001B[38;5;241m=\u001B[39m \u001B[38;5;28misinstance\u001B[39m(e, socket\u001B[38;5;241m.\u001B[39mtimeout)\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/site-packages/httplib2/__init__.py:1444\u001B[0m, in \u001B[0;36mHttp._request\u001B[0;34m(self, conn, host, absolute_uri, request_uri, method, body, headers, redirections, cachekey)\u001B[0m\n\u001B[1;32m 1441\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m auth:\n\u001B[1;32m 1442\u001B[0m auth\u001B[38;5;241m.\u001B[39mrequest(method, request_uri, headers, body)\n\u001B[0;32m-> 1444\u001B[0m (response, content) \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_conn_request(conn, request_uri, method, body, headers)\n\u001B[1;32m 1446\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m auth:\n\u001B[1;32m 1447\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m auth\u001B[38;5;241m.\u001B[39mresponse(response, body):\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/site-packages/httplib2/__init__.py:1367\u001B[0m, in \u001B[0;36mHttp._conn_request\u001B[0;34m(self, conn, request_uri, method, body, headers)\u001B[0m\n\u001B[1;32m 1365\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m conn\u001B[38;5;241m.\u001B[39msock \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[1;32m 1366\u001B[0m conn\u001B[38;5;241m.\u001B[39mconnect()\n\u001B[0;32m-> 1367\u001B[0m conn\u001B[38;5;241m.\u001B[39mrequest(method, request_uri, body, headers)\n\u001B[1;32m 1368\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m socket\u001B[38;5;241m.\u001B[39mtimeout:\n\u001B[1;32m 1369\u001B[0m conn\u001B[38;5;241m.\u001B[39mclose()\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/http/client.py:1294\u001B[0m, in \u001B[0;36mHTTPConnection.request\u001B[0;34m(self, method, url, body, headers, encode_chunked)\u001B[0m\n\u001B[1;32m 1291\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mrequest\u001B[39m(\u001B[38;5;28mself\u001B[39m, method, url, body\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m, headers\u001B[38;5;241m=\u001B[39m{}, \u001B[38;5;241m*\u001B[39m,\n\u001B[1;32m 1292\u001B[0m encode_chunked\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m):\n\u001B[1;32m 1293\u001B[0m \u001B[38;5;250m \u001B[39m\u001B[38;5;124;03m\"\"\"Send a complete request to the server.\"\"\"\u001B[39;00m\n\u001B[0;32m-> 1294\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_send_request(method, url, body, headers, encode_chunked)\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/http/client.py:1340\u001B[0m, in \u001B[0;36mHTTPConnection._send_request\u001B[0;34m(self, method, url, body, headers, encode_chunked)\u001B[0m\n\u001B[1;32m 1336\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(body, \u001B[38;5;28mstr\u001B[39m):\n\u001B[1;32m 1337\u001B[0m \u001B[38;5;66;03m# RFC 2616 Section 3.7.1 says that text default has a\u001B[39;00m\n\u001B[1;32m 1338\u001B[0m \u001B[38;5;66;03m# default charset of iso-8859-1.\u001B[39;00m\n\u001B[1;32m 1339\u001B[0m body \u001B[38;5;241m=\u001B[39m _encode(body, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mbody\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[0;32m-> 1340\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mendheaders(body, encode_chunked\u001B[38;5;241m=\u001B[39mencode_chunked)\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/http/client.py:1289\u001B[0m, in \u001B[0;36mHTTPConnection.endheaders\u001B[0;34m(self, message_body, encode_chunked)\u001B[0m\n\u001B[1;32m 1287\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m 1288\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m CannotSendHeader()\n\u001B[0;32m-> 1289\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_send_output(message_body, encode_chunked\u001B[38;5;241m=\u001B[39mencode_chunked)\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/http/client.py:1048\u001B[0m, in \u001B[0;36mHTTPConnection._send_output\u001B[0;34m(self, message_body, encode_chunked)\u001B[0m\n\u001B[1;32m 1046\u001B[0m msg \u001B[38;5;241m=\u001B[39m \u001B[38;5;124mb\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;130;01m\\r\u001B[39;00m\u001B[38;5;130;01m\\n\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;241m.\u001B[39mjoin(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_buffer)\n\u001B[1;32m 1047\u001B[0m \u001B[38;5;28;01mdel\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_buffer[:]\n\u001B[0;32m-> 1048\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39msend(msg)\n\u001B[1;32m 1050\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m message_body \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[1;32m 1051\u001B[0m \n\u001B[1;32m 1052\u001B[0m \u001B[38;5;66;03m# create a consistent interface to message_body\u001B[39;00m\n\u001B[1;32m 1053\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mhasattr\u001B[39m(message_body, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mread\u001B[39m\u001B[38;5;124m'\u001B[39m):\n\u001B[1;32m 1054\u001B[0m \u001B[38;5;66;03m# Let file-like take precedence over byte-like. This\u001B[39;00m\n\u001B[1;32m 1055\u001B[0m \u001B[38;5;66;03m# is needed to allow the current position of mmap'ed\u001B[39;00m\n\u001B[1;32m 1056\u001B[0m \u001B[38;5;66;03m# files to be taken into account.\u001B[39;00m\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/http/client.py:1009\u001B[0m, in \u001B[0;36mHTTPConnection.send\u001B[0;34m(self, data)\u001B[0m\n\u001B[1;32m 1007\u001B[0m sys\u001B[38;5;241m.\u001B[39maudit(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mhttp.client.send\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;28mself\u001B[39m, data)\n\u001B[1;32m 1008\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m-> 1009\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39msock\u001B[38;5;241m.\u001B[39msendall(data)\n\u001B[1;32m 1010\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mTypeError\u001B[39;00m:\n\u001B[1;32m 1011\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(data, collections\u001B[38;5;241m.\u001B[39mabc\u001B[38;5;241m.\u001B[39mIterable):\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/ssl.py:1274\u001B[0m, in \u001B[0;36mSSLSocket.sendall\u001B[0;34m(self, data, flags)\u001B[0m\n\u001B[1;32m 1272\u001B[0m amount \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mlen\u001B[39m(byte_view)\n\u001B[1;32m 1273\u001B[0m \u001B[38;5;28;01mwhile\u001B[39;00m count \u001B[38;5;241m<\u001B[39m amount:\n\u001B[0;32m-> 1274\u001B[0m v \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39msend(byte_view[count:])\n\u001B[1;32m 1275\u001B[0m count \u001B[38;5;241m+\u001B[39m\u001B[38;5;241m=\u001B[39m v\n\u001B[1;32m 1276\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n", "File \u001B[0;32m/opt/anaconda3/lib/python3.11/ssl.py:1243\u001B[0m, in \u001B[0;36mSSLSocket.send\u001B[0;34m(self, data, flags)\u001B[0m\n\u001B[1;32m 1239\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m flags \u001B[38;5;241m!=\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[1;32m 1240\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\n\u001B[1;32m 1241\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mnon-zero flags not allowed in calls to send() on \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;124m\"\u001B[39m \u001B[38;5;241m%\u001B[39m\n\u001B[1;32m 1242\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m\u001B[38;5;18m__class__\u001B[39m)\n\u001B[0;32m-> 1243\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_sslobj\u001B[38;5;241m.\u001B[39mwrite(data)\n\u001B[1;32m 1244\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m 1245\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28msuper\u001B[39m()\u001B[38;5;241m.\u001B[39msend(data, flags)\n", "\u001B[0;31mSSLEOFError\u001B[0m: EOF occurred in violation of protocol (_ssl.c:2427)" ] } ], "execution_count": 35 }, { "metadata": {}, "cell_type": "code", "outputs": [], "execution_count": null, "source": "", "id": "bbdba8050ee4f8f6" } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 5 }