[{"data":1,"prerenderedAt":3339},["ShallowReactive",2],{"navigation_docs":3,"-datapoint-uploading-your-data-with-our-api":98,"-datapoint-uploading-your-data-with-our-api-surround":3334},[4,40,65,82],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30,35],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Project Structure","\u002Fgetting-started\u002Fproject-structure","1.getting-started\u002F4.project-structure","i-lucide-folder-tree",{"title":26,"path":27,"stem":28,"icon":29},"Studio module","\u002Fgetting-started\u002Fstudio","1.getting-started\u002F5.studio","i-lucide-mouse-pointer-2",{"title":31,"path":32,"stem":33,"icon":34},"Migration","\u002Fgetting-started\u002Fmigration","1.getting-started\u002F6.migration","i-lucide-replace",{"title":36,"path":37,"stem":38,"icon":39},"Troubleshooting","\u002Fgetting-started\u002Ftroubleshooting","1.getting-started\u002F7.troubleshooting","i-lucide-wrench",{"title":41,"path":42,"stem":43,"children":44,"page":6},"Essentials","\u002Fessentials","2.essentials",[45,50,55,60],{"title":46,"path":47,"stem":48,"icon":49},"Markdown Syntax","\u002Fessentials\u002Fmarkdown-syntax","2.essentials\u002F1.markdown-syntax","i-lucide-heading-1",{"title":51,"path":52,"stem":53,"icon":54},"Code Blocks","\u002Fessentials\u002Fcode-blocks","2.essentials\u002F2.code-blocks","i-lucide-code-xml",{"title":56,"path":57,"stem":58,"icon":59},"Components","\u002Fessentials\u002Fcomponents","2.essentials\u002F3.components","i-lucide-component",{"title":61,"path":62,"stem":63,"icon":64},"Images and Embeds","\u002Fessentials\u002Fimages-embeds","2.essentials\u002F4.images-embeds","i-lucide-image",{"title":66,"path":67,"stem":68,"children":69,"page":6},"ChangeLogs","\u002Fchange-logs","3. Change Logs",[70,74,78],{"title":71,"path":72,"stem":73,"icon":49},"Core WebApp","\u002Fchange-logs\u002Fcore-webapp","3. Change Logs\u002FCore WebApp",{"title":75,"path":76,"stem":77,"icon":49},"Statistics","\u002Fchange-logs\u002Fstatistics","3. Change Logs\u002FStatistics",{"title":79,"path":80,"stem":81,"icon":49},"Storms","\u002Fchange-logs\u002Fstorms","3. Change Logs\u002FStorms",{"title":83,"path":84,"stem":83,"children":85,"page":6},"Datapoint","\u002Fdatapoint",[86,90,94],{"title":87,"path":88,"stem":89,"icon":14},"How to use the CET Dashboard","\u002Fdatapoint\u002Fhow-to-use-cet-dashboard","Datapoint\u002FHow to Use CET Dashboard",{"title":91,"path":92,"stem":93},"DataPoint API Integration Guides","\u002Fdatapoint\u002Fuploading-your-data-with-our-api","Datapoint\u002FUploading your data with our API ",{"title":95,"path":96,"stem":97,"icon":14},"Getting Started with Datapoint","\u002Fdatapoint\u002Fwhat-is-datapoint","Datapoint\u002FWhat is Datapoint",{"id":99,"title":91,"body":100,"description":135,"extension":3329,"links":3330,"meta":3331,"navigation":1049,"path":92,"seo":3332,"stem":93,"__hash__":3333},"docs\u002FDatapoint\u002FUploading your data with our API .md",{"type":101,"value":102,"toc":3291},"minimark",[103,107,110,115,119,125,136,141,147,149,154,181,221,223,227,268,560,648,650,654,743,745,749,752,900,907,909,913,916,918,920,924,927,929,933,948,950,954,966,984,986,990,1001,1003,1007,1014,1016,1020,1023,1435,1437,1441,1448,1450,1454,1467,1469,1473,1490,1501,1504,1506,1508,1512,1524,1526,1529,1538,1565,1567,1571,1596,1598,1602,1612,1638,1640,1644,1659,1836,1838,1842,1849,1855,1863,1865,1869,1887,2195,2198,2200,2204,2214,2230,2232,2234,2238,2241,2243,2247,2258,2260,2263,2272,2305,2307,2311,2318,3182,3184,3188,3193,3195,3199,3210,3212,3216,3239,3241,3245,3263,3278,3280,3284,3287],[104,105,91],"h1",{"id":106},"datapoint-api-integration-guides",[108,109],"hr",{},[111,112,114],"h2",{"id":113},"method-1-direct-http-rest-api","Method 1 — Direct HTTP \u002F REST API",[116,117,118],"p",{},"Push data to DataPoint from any HTTP client (curl, Postman, Python, etc.).",[116,120,121],{},[122,123,124],"strong",{},"Endpoint",[126,127,132],"pre",{"className":128,"code":130,"language":131},[129],"language-text","POST https:\u002F\u002Fdatapoint.meteomaps.com\u002Ffunctions\u002Fv1\u002Fingest-dataset\n","text",[133,134,130],"code",{"__ignoreMap":135},"",[116,137,138],{},[122,139,140],{},"Headers",[126,142,145],{"className":143,"code":144,"language":131},[129],"Authorization: Bearer YOUR_ACCESS_TOKEN\nContent-Type: application\u002Fjson\n",[133,146,144],{"__ignoreMap":135},[108,148],{},[150,151,153],"h3",{"id":152},"step-1-obtain-your-session-token","Step 1 — Obtain your session token",[116,155,156,157,160,161,164,165,168,169,172,173,176,177,180],{},"Sign in to DataPoint in your browser. Open developer tools (",[133,158,159],{},"F12"," on Windows \u002F ",[133,162,163],{},"Cmd+Option+I"," on Mac) and go to ",[122,166,167],{},"Application → Local Storage",". Click the entry containing ",[133,170,171],{},"supabase"," and locate the key ending in ",[133,174,175],{},"auth-token",". Its value is a JSON object — copy the ",[133,178,179],{},"access_token"," string from inside it.",[182,183,184],"blockquote",{},[116,185,186,189,190,192,193,196,197,199,200,202,203,206,207,210,211,213,214,217,218,220],{},[122,187,188],{},"Note:"," The ",[133,191,179],{}," expires after approximately 1 hour, but the ",[133,194,195],{},"refresh_token"," is long-lived (60 days by default). For scheduled or daily\u002Fmonthly scripts, store the ",[133,198,195],{}," in a secure location (environment variable, secrets manager, etc.). Before each run, exchange it for a new ",[133,201,179],{}," via ",[133,204,205],{},"POST https:\u002F\u002Fdatapoint.meteomaps.com\u002Fauth\u002Fv1\u002Ftoken?grant_type=refresh_token"," with body ",[133,208,209],{},"{\"refresh_token\":\"YOUR_REFRESH_TOKEN\"}",". The response contains a new ",[133,212,179],{}," ",[122,215,216],{},"and"," a new ",[133,219,195],{}," — save the new refresh token to replace the old one. This chain means a script can run indefinitely without manual intervention, as long as it runs at least once every 60 days.",[108,222],{},[150,224,226],{"id":225},"step-2-prepare-your-json-request-body","Step 2 — Prepare your JSON request body",[116,228,229,230,233,234,237,238,240,241,244,245,248,249,248,252,255,256,259,260,263,264,267],{},"Construct a JSON object with the fields below. ",[133,231,232],{},"name"," and ",[133,235,236],{},"rows"," are required. Each object in ",[133,239,236],{}," must include a ",[133,242,243],{},"Year"," field (integer). Monthly columns follow the pattern ",[133,246,247],{},"MM_max",", ",[133,250,251],{},"MM_min",[133,253,254],{},"MM_rain"," where ",[133,257,258],{},"MM"," is the zero-padded month number (",[133,261,262],{},"01","–",[133,265,266],{},"12","). Columns without data can be omitted.",[126,269,273],{"className":270,"code":271,"language":272,"meta":135,"style":135},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"My Station 2024\",\n  \"description\": \"Optional description\",\n  \"is_public\": true,\n  \"rows\": [\n    {\n      \"Year\": 2023,\n      \"01_max\": 8.2, \"01_min\": 2.1, \"01_rain\": 62.4,\n      \"06_max\": 21.0, \"06_min\": 11.5, \"06_rain\": 38.0\n    },\n    {\n      \"Year\": 2024,\n      \"01_max\": 7.9, \"01_min\": 1.8, \"01_rain\": 58.0\n    }\n  ]\n}\n","json",[133,274,275,284,311,332,347,361,367,386,432,475,481,486,502,542,548,554],{"__ignoreMap":135},[276,277,280],"span",{"class":278,"line":279},"line",1,[276,281,283],{"class":282},"sMK4o","{\n",[276,285,287,290,293,296,299,302,306,308],{"class":278,"line":286},2,[276,288,289],{"class":282},"  \"",[276,291,232],{"class":292},"spNyl",[276,294,295],{"class":282},"\"",[276,297,298],{"class":282},":",[276,300,301],{"class":282}," \"",[276,303,305],{"class":304},"sfazB","My Station 2024",[276,307,295],{"class":282},[276,309,310],{"class":282},",\n",[276,312,314,316,319,321,323,325,328,330],{"class":278,"line":313},3,[276,315,289],{"class":282},[276,317,318],{"class":292},"description",[276,320,295],{"class":282},[276,322,298],{"class":282},[276,324,301],{"class":282},[276,326,327],{"class":304},"Optional description",[276,329,295],{"class":282},[276,331,310],{"class":282},[276,333,335,337,340,342,344],{"class":278,"line":334},4,[276,336,289],{"class":282},[276,338,339],{"class":292},"is_public",[276,341,295],{"class":282},[276,343,298],{"class":282},[276,345,346],{"class":282}," true,\n",[276,348,350,352,354,356,358],{"class":278,"line":349},5,[276,351,289],{"class":282},[276,353,236],{"class":292},[276,355,295],{"class":282},[276,357,298],{"class":282},[276,359,360],{"class":282}," [\n",[276,362,364],{"class":278,"line":363},6,[276,365,366],{"class":282},"    {\n",[276,368,370,373,376,378,380,384],{"class":278,"line":369},7,[276,371,372],{"class":282},"      \"",[276,374,243],{"class":375},"sBMFI",[276,377,295],{"class":282},[276,379,298],{"class":282},[276,381,383],{"class":382},"sbssI"," 2023",[276,385,310],{"class":282},[276,387,389,391,394,396,398,401,404,406,409,411,413,416,418,420,423,425,427,430],{"class":278,"line":388},8,[276,390,372],{"class":282},[276,392,393],{"class":375},"01_max",[276,395,295],{"class":282},[276,397,298],{"class":282},[276,399,400],{"class":382}," 8.2",[276,402,403],{"class":282},",",[276,405,301],{"class":282},[276,407,408],{"class":375},"01_min",[276,410,295],{"class":282},[276,412,298],{"class":282},[276,414,415],{"class":382}," 2.1",[276,417,403],{"class":282},[276,419,301],{"class":282},[276,421,422],{"class":375},"01_rain",[276,424,295],{"class":282},[276,426,298],{"class":282},[276,428,429],{"class":382}," 62.4",[276,431,310],{"class":282},[276,433,435,437,440,442,444,447,449,451,454,456,458,461,463,465,468,470,472],{"class":278,"line":434},9,[276,436,372],{"class":282},[276,438,439],{"class":375},"06_max",[276,441,295],{"class":282},[276,443,298],{"class":282},[276,445,446],{"class":382}," 21.0",[276,448,403],{"class":282},[276,450,301],{"class":282},[276,452,453],{"class":375},"06_min",[276,455,295],{"class":282},[276,457,298],{"class":282},[276,459,460],{"class":382}," 11.5",[276,462,403],{"class":282},[276,464,301],{"class":282},[276,466,467],{"class":375},"06_rain",[276,469,295],{"class":282},[276,471,298],{"class":282},[276,473,474],{"class":382}," 38.0\n",[276,476,478],{"class":278,"line":477},10,[276,479,480],{"class":282},"    },\n",[276,482,484],{"class":278,"line":483},11,[276,485,366],{"class":282},[276,487,489,491,493,495,497,500],{"class":278,"line":488},12,[276,490,372],{"class":282},[276,492,243],{"class":375},[276,494,295],{"class":282},[276,496,298],{"class":282},[276,498,499],{"class":382}," 2024",[276,501,310],{"class":282},[276,503,505,507,509,511,513,516,518,520,522,524,526,529,531,533,535,537,539],{"class":278,"line":504},13,[276,506,372],{"class":282},[276,508,393],{"class":375},[276,510,295],{"class":282},[276,512,298],{"class":282},[276,514,515],{"class":382}," 7.9",[276,517,403],{"class":282},[276,519,301],{"class":282},[276,521,408],{"class":375},[276,523,295],{"class":282},[276,525,298],{"class":282},[276,527,528],{"class":382}," 1.8",[276,530,403],{"class":282},[276,532,301],{"class":282},[276,534,422],{"class":375},[276,536,295],{"class":282},[276,538,298],{"class":282},[276,540,541],{"class":382}," 58.0\n",[276,543,545],{"class":278,"line":544},14,[276,546,547],{"class":282},"    }\n",[276,549,551],{"class":278,"line":550},15,[276,552,553],{"class":282},"  ]\n",[276,555,557],{"class":278,"line":556},16,[276,558,559],{"class":282},"}\n",[561,562,563,582],"table",{},[564,565,566],"thead",{},[567,568,569,573,576,579],"tr",{},[570,571,572],"th",{},"Field",[570,574,575],{},"Type",[570,577,578],{},"Required",[570,580,581],{},"Description",[583,584,585,601,614,631],"tbody",{},[567,586,587,592,595,598],{},[588,589,590],"td",{},[133,591,232],{},[588,593,594],{},"string",[588,596,597],{},"Yes",[588,599,600],{},"Dataset title shown in the Directory",[567,602,603,607,609,612],{},[588,604,605],{},[133,606,318],{},[588,608,594],{},[588,610,611],{},"No",[588,613,327],{},[567,615,616,620,623,625],{},[588,617,618],{},[133,619,339],{},[588,621,622],{},"boolean",[588,624,611],{},[588,626,627,628],{},"Whether others can view it. Defaults to ",[133,629,630],{},"true",[567,632,633,637,640,642],{},[588,634,635],{},[133,636,236],{},[588,638,639],{},"array",[588,641,597],{},[588,643,644,645,647],{},"Array of row objects, each with a ",[133,646,243],{}," field",[108,649],{},[150,651,653],{"id":652},"step-3-send-the-post-request","Step 3 — Send the POST request",[126,655,659],{"className":656,"code":657,"language":658,"meta":135,"style":135},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X POST \"https:\u002F\u002Fdatapoint.meteomaps.com\u002Ffunctions\u002Fv1\u002Fingest-dataset\" \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"My Station 2024\",\n    \"is_public\": true,\n    \"rows\": [{\"Year\": 2023, \"07_max\": 24.3, \"07_min\": 13.8}]\n  }'\n","bash",[133,660,661,683,697,710,720,725,730,735],{"__ignoreMap":135},[276,662,663,666,669,672,674,677,679],{"class":278,"line":279},[276,664,665],{"class":375},"curl",[276,667,668],{"class":304}," -X",[276,670,671],{"class":304}," POST",[276,673,301],{"class":282},[276,675,676],{"class":304},"https:\u002F\u002Fdatapoint.meteomaps.com\u002Ffunctions\u002Fv1\u002Fingest-dataset",[276,678,295],{"class":282},[276,680,682],{"class":681},"sTEyZ"," \\\n",[276,684,685,688,690,693,695],{"class":278,"line":286},[276,686,687],{"class":304},"  -H",[276,689,301],{"class":282},[276,691,692],{"class":304},"Authorization: Bearer YOUR_ACCESS_TOKEN",[276,694,295],{"class":282},[276,696,682],{"class":681},[276,698,699,701,703,706,708],{"class":278,"line":313},[276,700,687],{"class":304},[276,702,301],{"class":282},[276,704,705],{"class":304},"Content-Type: application\u002Fjson",[276,707,295],{"class":282},[276,709,682],{"class":681},[276,711,712,715,718],{"class":278,"line":334},[276,713,714],{"class":304},"  -d",[276,716,717],{"class":282}," '",[276,719,283],{"class":304},[276,721,722],{"class":278,"line":349},[276,723,724],{"class":304},"    \"name\": \"My Station 2024\",\n",[276,726,727],{"class":278,"line":363},[276,728,729],{"class":304},"    \"is_public\": true,\n",[276,731,732],{"class":278,"line":369},[276,733,734],{"class":304},"    \"rows\": [{\"Year\": 2023, \"07_max\": 24.3, \"07_min\": 13.8}]\n",[276,736,737,740],{"class":278,"line":388},[276,738,739],{"class":304},"  }",[276,741,742],{"class":282},"'\n",[108,744],{},[150,746,748],{"id":747},"step-4-read-the-response","Step 4 — Read the response",[116,750,751],{},"On success the API returns HTTP 200 with:",[126,753,755],{"className":270,"code":754,"language":272,"meta":135,"style":135},"{\n  \"success\": true,\n  \"dataset\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"My Station 2024\",\n    \"rowCount\": 2,\n    \"columnCount\": 4,\n    \"isPublic\": true,\n    \"createdAt\": \"2024-07-15T10:30:00Z\"\n  }\n}\n",[133,756,757,761,774,788,809,827,843,859,872,891,896],{"__ignoreMap":135},[276,758,759],{"class":278,"line":279},[276,760,283],{"class":282},[276,762,763,765,768,770,772],{"class":278,"line":286},[276,764,289],{"class":282},[276,766,767],{"class":292},"success",[276,769,295],{"class":282},[276,771,298],{"class":282},[276,773,346],{"class":282},[276,775,776,778,781,783,785],{"class":278,"line":313},[276,777,289],{"class":282},[276,779,780],{"class":292},"dataset",[276,782,295],{"class":282},[276,784,298],{"class":282},[276,786,787],{"class":282}," {\n",[276,789,790,793,796,798,800,802,805,807],{"class":278,"line":334},[276,791,792],{"class":282},"    \"",[276,794,795],{"class":375},"id",[276,797,295],{"class":282},[276,799,298],{"class":282},[276,801,301],{"class":282},[276,803,804],{"class":304},"550e8400-e29b-41d4-a716-446655440000",[276,806,295],{"class":282},[276,808,310],{"class":282},[276,810,811,813,815,817,819,821,823,825],{"class":278,"line":349},[276,812,792],{"class":282},[276,814,232],{"class":375},[276,816,295],{"class":282},[276,818,298],{"class":282},[276,820,301],{"class":282},[276,822,305],{"class":304},[276,824,295],{"class":282},[276,826,310],{"class":282},[276,828,829,831,834,836,838,841],{"class":278,"line":363},[276,830,792],{"class":282},[276,832,833],{"class":375},"rowCount",[276,835,295],{"class":282},[276,837,298],{"class":282},[276,839,840],{"class":382}," 2",[276,842,310],{"class":282},[276,844,845,847,850,852,854,857],{"class":278,"line":369},[276,846,792],{"class":282},[276,848,849],{"class":375},"columnCount",[276,851,295],{"class":282},[276,853,298],{"class":282},[276,855,856],{"class":382}," 4",[276,858,310],{"class":282},[276,860,861,863,866,868,870],{"class":278,"line":388},[276,862,792],{"class":282},[276,864,865],{"class":375},"isPublic",[276,867,295],{"class":282},[276,869,298],{"class":282},[276,871,346],{"class":282},[276,873,874,876,879,881,883,885,888],{"class":278,"line":434},[276,875,792],{"class":282},[276,877,878],{"class":375},"createdAt",[276,880,295],{"class":282},[276,882,298],{"class":282},[276,884,301],{"class":282},[276,886,887],{"class":304},"2024-07-15T10:30:00Z",[276,889,890],{"class":282},"\"\n",[276,892,893],{"class":278,"line":477},[276,894,895],{"class":282},"  }\n",[276,897,898],{"class":278,"line":483},[276,899,559],{"class":282},[116,901,902,903,906],{},"On error, the response includes an ",[133,904,905],{},"error"," field describing what went wrong.",[108,908],{},[150,910,912],{"id":911},"step-5-verify-in-datapoint","Step 5 — Verify in DataPoint",[116,914,915],{},"Log in to DataPoint and open the Directory. Your new dataset appears at the top of the list under your account. Click it to open the Dataset Viewer and confirm the data looks correct.",[108,917],{},[108,919],{},[111,921,923],{"id":922},"method-2-excel-vba-macro","Method 2 — Excel VBA Macro",[116,925,926],{},"Uploads the active Excel sheet directly from desktop Excel (Windows). No add-ins or extra licencing required.",[108,928],{},[150,930,932],{"id":931},"step-1-enable-the-developer-tab","Step 1 — Enable the Developer tab",[116,934,935,936,939,940,943,944,947],{},"Click ",[122,937,938],{},"File → Options → Customize Ribbon",". In the right-hand \"Main Tabs\" list, tick ",[122,941,942],{},"Developer"," and click ",[122,945,946],{},"OK",". This is a one-time step.",[108,949],{},[150,951,953],{"id":952},"step-2-obtain-your-session-token","Step 2 — Obtain your session token",[116,955,956,957,959,960,962,963,965],{},"Sign in to DataPoint in your browser. Press ",[133,958,159],{},", go to ",[122,961,167],{},", click the Supabase entry, and copy the ",[133,964,179],{}," value from the JSON object stored there.",[182,967,968],{},[116,969,970,189,972,974,975,977,978,980,981,983],{},[122,971,188],{},[133,973,179],{}," expires after ~1 hour. If you run the macro within that window it will work without any changes. If it returns an authentication error, simply copy a fresh ",[133,976,179],{}," from the browser and paste it back into line 2. For fully automated scheduled runs, see the refresh token approach described in Method 1 Step 1 — the same logic applies; store the ",[133,979,195],{}," and exchange it for a new ",[133,982,179],{}," before each run.",[108,985],{},[150,987,989],{"id":988},"step-3-open-the-visual-basic-editor","Step 3 — Open the Visual Basic Editor",[116,991,992,993,996,997,1000],{},"Press ",[133,994,995],{},"Alt + F11"," (or click ",[122,998,999],{},"Developer → Visual Basic"," in the ribbon). The VBA editor opens in a new window.",[108,1002],{},[150,1004,1006],{"id":1005},"step-4-insert-a-new-module","Step 4 — Insert a new module",[116,1008,1009,1010,1013],{},"In the Project panel on the left, right-click your workbook name and choose ",[122,1011,1012],{},"Insert → Module",". A blank code window opens.",[108,1015],{},[150,1017,1019],{"id":1018},"step-5-paste-the-macro","Step 5 — Paste the macro",[116,1021,1022],{},"Click inside the blank module and paste the following code:",[126,1024,1028],{"className":1025,"code":1026,"language":1027,"meta":135,"style":135},"language-vba shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Sub PushToDataPoint()\n    Dim TOKEN As String\n    TOKEN = \"YOUR_ACCESS_TOKEN_HERE\" ' replace with your access_token\n\n    Dim ws As Worksheet\n    Set ws = ActiveSheet\n\n    Dim lastRow As Long\n    Dim lastCol As Long\n    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row\n    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column\n\n    Dim headers() As String\n    ReDim headers(1 To lastCol)\n    Dim c As Long\n    For c = 1 To lastCol\n        headers(c) = CStr(ws.Cells(1, c).Value)\n    Next c\n\n    Dim rowsJson As String\n    rowsJson = \"[\"\n    Dim r As Long\n    For r = 2 To lastRow\n        Dim rowJson As String\n        rowJson = \"{\"\n        Dim firstField As Boolean\n        firstField = True\n        For c = 1 To lastCol\n            Dim cellVal As Variant\n            cellVal = ws.Cells(r, c).Value\n            If cellVal \u003C> \"\" Then\n                If Not firstField Then rowJson = rowJson & \",\"\n                Dim valStr As String\n                If IsNumeric(cellVal) Then\n                    valStr = CStr(cellVal)\n                Else\n                    valStr = Chr(34) & Replace(CStr(cellVal), Chr(34), \"\\\" & Chr(34)) & Chr(34)\n                End If\n                rowJson = rowJson & Chr(34) & headers(c) & Chr(34) & \":\" & valStr\n                firstField = False\n            End If\n        Next c\n        rowJson = rowJson & \"}\"\n        If r > 2 Then rowsJson = rowsJson & \",\"\n        rowsJson = rowsJson & rowJson\n    Next r\n    rowsJson = rowsJson & \"]\"\n\n    Dim sheetName As String\n    sheetName = Replace(ws.Name, Chr(34), \"'\")\n    Dim payload As String\n    payload = \"{\" & _\n        Chr(34) & \"name\" & Chr(34) & \":\" & Chr(34) & sheetName & \" Export\" & Chr(34) & \",\" & _\n        Chr(34) & \"description\" & Chr(34) & \":\" & Chr(34) & \"Exported from Excel\" & Chr(34) & \",\" & _\n        Chr(34) & \"is_public\" & Chr(34) & \":true,\" & _\n        Chr(34) & \"rows\" & Chr(34) & \":\" & rowsJson & _\n        \"}\"\n\n    Dim http As Object\n    Set http = CreateObject(\"MSXML2.XMLHTTP\")\n    http.Open \"POST\", \"https:\u002F\u002Fdatapoint.meteomaps.com\u002Ffunctions\u002Fv1\u002Fingest-dataset\", False\n    http.setRequestHeader \"Content-Type\", \"application\u002Fjson\"\n    http.setRequestHeader \"Authorization\", \"Bearer \" & TOKEN\n    http.send payload\n\n    If http.Status = 200 Or http.Status = 201 Then\n        MsgBox \"Upload successful!\", vbInformation, \"DataPoint\"\n    Else\n        MsgBox \"Upload failed.\" & vbCrLf & \"Status: \" & http.Status & vbCrLf & http.responseText, vbCritical, \"DataPoint\"\n    End If\nEnd Sub\n","vba",[133,1029,1030,1035,1040,1045,1051,1056,1061,1065,1070,1075,1080,1085,1089,1094,1099,1104,1109,1115,1121,1126,1132,1138,1144,1150,1156,1162,1168,1174,1180,1186,1192,1198,1204,1210,1216,1222,1228,1234,1240,1246,1252,1258,1264,1270,1276,1282,1288,1294,1299,1305,1311,1317,1323,1329,1335,1341,1347,1353,1358,1364,1370,1376,1382,1388,1394,1399,1405,1411,1417,1423,1429],{"__ignoreMap":135},[276,1031,1032],{"class":278,"line":279},[276,1033,1034],{},"Sub PushToDataPoint()\n",[276,1036,1037],{"class":278,"line":286},[276,1038,1039],{},"    Dim TOKEN As String\n",[276,1041,1042],{"class":278,"line":313},[276,1043,1044],{},"    TOKEN = \"YOUR_ACCESS_TOKEN_HERE\" ' replace with your access_token\n",[276,1046,1047],{"class":278,"line":334},[276,1048,1050],{"emptyLinePlaceholder":1049},true,"\n",[276,1052,1053],{"class":278,"line":349},[276,1054,1055],{},"    Dim ws As Worksheet\n",[276,1057,1058],{"class":278,"line":363},[276,1059,1060],{},"    Set ws = ActiveSheet\n",[276,1062,1063],{"class":278,"line":369},[276,1064,1050],{"emptyLinePlaceholder":1049},[276,1066,1067],{"class":278,"line":388},[276,1068,1069],{},"    Dim lastRow As Long\n",[276,1071,1072],{"class":278,"line":434},[276,1073,1074],{},"    Dim lastCol As Long\n",[276,1076,1077],{"class":278,"line":477},[276,1078,1079],{},"    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row\n",[276,1081,1082],{"class":278,"line":483},[276,1083,1084],{},"    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column\n",[276,1086,1087],{"class":278,"line":488},[276,1088,1050],{"emptyLinePlaceholder":1049},[276,1090,1091],{"class":278,"line":504},[276,1092,1093],{},"    Dim headers() As String\n",[276,1095,1096],{"class":278,"line":544},[276,1097,1098],{},"    ReDim headers(1 To lastCol)\n",[276,1100,1101],{"class":278,"line":550},[276,1102,1103],{},"    Dim c As Long\n",[276,1105,1106],{"class":278,"line":556},[276,1107,1108],{},"    For c = 1 To lastCol\n",[276,1110,1112],{"class":278,"line":1111},17,[276,1113,1114],{},"        headers(c) = CStr(ws.Cells(1, c).Value)\n",[276,1116,1118],{"class":278,"line":1117},18,[276,1119,1120],{},"    Next c\n",[276,1122,1124],{"class":278,"line":1123},19,[276,1125,1050],{"emptyLinePlaceholder":1049},[276,1127,1129],{"class":278,"line":1128},20,[276,1130,1131],{},"    Dim rowsJson As String\n",[276,1133,1135],{"class":278,"line":1134},21,[276,1136,1137],{},"    rowsJson = \"[\"\n",[276,1139,1141],{"class":278,"line":1140},22,[276,1142,1143],{},"    Dim r As Long\n",[276,1145,1147],{"class":278,"line":1146},23,[276,1148,1149],{},"    For r = 2 To lastRow\n",[276,1151,1153],{"class":278,"line":1152},24,[276,1154,1155],{},"        Dim rowJson As String\n",[276,1157,1159],{"class":278,"line":1158},25,[276,1160,1161],{},"        rowJson = \"{\"\n",[276,1163,1165],{"class":278,"line":1164},26,[276,1166,1167],{},"        Dim firstField As Boolean\n",[276,1169,1171],{"class":278,"line":1170},27,[276,1172,1173],{},"        firstField = True\n",[276,1175,1177],{"class":278,"line":1176},28,[276,1178,1179],{},"        For c = 1 To lastCol\n",[276,1181,1183],{"class":278,"line":1182},29,[276,1184,1185],{},"            Dim cellVal As Variant\n",[276,1187,1189],{"class":278,"line":1188},30,[276,1190,1191],{},"            cellVal = ws.Cells(r, c).Value\n",[276,1193,1195],{"class":278,"line":1194},31,[276,1196,1197],{},"            If cellVal \u003C> \"\" Then\n",[276,1199,1201],{"class":278,"line":1200},32,[276,1202,1203],{},"                If Not firstField Then rowJson = rowJson & \",\"\n",[276,1205,1207],{"class":278,"line":1206},33,[276,1208,1209],{},"                Dim valStr As String\n",[276,1211,1213],{"class":278,"line":1212},34,[276,1214,1215],{},"                If IsNumeric(cellVal) Then\n",[276,1217,1219],{"class":278,"line":1218},35,[276,1220,1221],{},"                    valStr = CStr(cellVal)\n",[276,1223,1225],{"class":278,"line":1224},36,[276,1226,1227],{},"                Else\n",[276,1229,1231],{"class":278,"line":1230},37,[276,1232,1233],{},"                    valStr = Chr(34) & Replace(CStr(cellVal), Chr(34), \"\\\" & Chr(34)) & Chr(34)\n",[276,1235,1237],{"class":278,"line":1236},38,[276,1238,1239],{},"                End If\n",[276,1241,1243],{"class":278,"line":1242},39,[276,1244,1245],{},"                rowJson = rowJson & Chr(34) & headers(c) & Chr(34) & \":\" & valStr\n",[276,1247,1249],{"class":278,"line":1248},40,[276,1250,1251],{},"                firstField = False\n",[276,1253,1255],{"class":278,"line":1254},41,[276,1256,1257],{},"            End If\n",[276,1259,1261],{"class":278,"line":1260},42,[276,1262,1263],{},"        Next c\n",[276,1265,1267],{"class":278,"line":1266},43,[276,1268,1269],{},"        rowJson = rowJson & \"}\"\n",[276,1271,1273],{"class":278,"line":1272},44,[276,1274,1275],{},"        If r > 2 Then rowsJson = rowsJson & \",\"\n",[276,1277,1279],{"class":278,"line":1278},45,[276,1280,1281],{},"        rowsJson = rowsJson & rowJson\n",[276,1283,1285],{"class":278,"line":1284},46,[276,1286,1287],{},"    Next r\n",[276,1289,1291],{"class":278,"line":1290},47,[276,1292,1293],{},"    rowsJson = rowsJson & \"]\"\n",[276,1295,1297],{"class":278,"line":1296},48,[276,1298,1050],{"emptyLinePlaceholder":1049},[276,1300,1302],{"class":278,"line":1301},49,[276,1303,1304],{},"    Dim sheetName As String\n",[276,1306,1308],{"class":278,"line":1307},50,[276,1309,1310],{},"    sheetName = Replace(ws.Name, Chr(34), \"'\")\n",[276,1312,1314],{"class":278,"line":1313},51,[276,1315,1316],{},"    Dim payload As String\n",[276,1318,1320],{"class":278,"line":1319},52,[276,1321,1322],{},"    payload = \"{\" & _\n",[276,1324,1326],{"class":278,"line":1325},53,[276,1327,1328],{},"        Chr(34) & \"name\" & Chr(34) & \":\" & Chr(34) & sheetName & \" Export\" & Chr(34) & \",\" & _\n",[276,1330,1332],{"class":278,"line":1331},54,[276,1333,1334],{},"        Chr(34) & \"description\" & Chr(34) & \":\" & Chr(34) & \"Exported from Excel\" & Chr(34) & \",\" & _\n",[276,1336,1338],{"class":278,"line":1337},55,[276,1339,1340],{},"        Chr(34) & \"is_public\" & Chr(34) & \":true,\" & _\n",[276,1342,1344],{"class":278,"line":1343},56,[276,1345,1346],{},"        Chr(34) & \"rows\" & Chr(34) & \":\" & rowsJson & _\n",[276,1348,1350],{"class":278,"line":1349},57,[276,1351,1352],{},"        \"}\"\n",[276,1354,1356],{"class":278,"line":1355},58,[276,1357,1050],{"emptyLinePlaceholder":1049},[276,1359,1361],{"class":278,"line":1360},59,[276,1362,1363],{},"    Dim http As Object\n",[276,1365,1367],{"class":278,"line":1366},60,[276,1368,1369],{},"    Set http = CreateObject(\"MSXML2.XMLHTTP\")\n",[276,1371,1373],{"class":278,"line":1372},61,[276,1374,1375],{},"    http.Open \"POST\", \"https:\u002F\u002Fdatapoint.meteomaps.com\u002Ffunctions\u002Fv1\u002Fingest-dataset\", False\n",[276,1377,1379],{"class":278,"line":1378},62,[276,1380,1381],{},"    http.setRequestHeader \"Content-Type\", \"application\u002Fjson\"\n",[276,1383,1385],{"class":278,"line":1384},63,[276,1386,1387],{},"    http.setRequestHeader \"Authorization\", \"Bearer \" & TOKEN\n",[276,1389,1391],{"class":278,"line":1390},64,[276,1392,1393],{},"    http.send payload\n",[276,1395,1397],{"class":278,"line":1396},65,[276,1398,1050],{"emptyLinePlaceholder":1049},[276,1400,1402],{"class":278,"line":1401},66,[276,1403,1404],{},"    If http.Status = 200 Or http.Status = 201 Then\n",[276,1406,1408],{"class":278,"line":1407},67,[276,1409,1410],{},"        MsgBox \"Upload successful!\", vbInformation, \"DataPoint\"\n",[276,1412,1414],{"class":278,"line":1413},68,[276,1415,1416],{},"    Else\n",[276,1418,1420],{"class":278,"line":1419},69,[276,1421,1422],{},"        MsgBox \"Upload failed.\" & vbCrLf & \"Status: \" & http.Status & vbCrLf & http.responseText, vbCritical, \"DataPoint\"\n",[276,1424,1426],{"class":278,"line":1425},70,[276,1427,1428],{},"    End If\n",[276,1430,1432],{"class":278,"line":1431},71,[276,1433,1434],{},"End Sub\n",[108,1436],{},[150,1438,1440],{"id":1439},"step-6-replace-the-token-placeholder","Step 6 — Replace the token placeholder",[116,1442,1443,1444,1447],{},"On line 2, replace ",[133,1445,1446],{},"YOUR_ACCESS_TOKEN_HERE"," (keep the surrounding quotes) with the token you copied in step 2.",[108,1449],{},[150,1451,1453],{"id":1452},"step-7-prepare-your-sheet","Step 7 — Prepare your sheet",[116,1455,1456,1457,1459,1460,248,1462,248,1464,1466],{},"Row 1 must be a header row. The year column header must be exactly ",[133,1458,243],{},". Monthly columns should follow the ",[133,1461,247],{},[133,1463,251],{},[133,1465,254],{}," naming convention. Data rows start from row 2. Click the sheet tab containing your data to make it the active sheet.",[108,1468],{},[150,1470,1472],{"id":1471},"step-8-run-the-macro","Step 8 — Run the macro",[116,1474,992,1475,1477,1478,1481,1482,1485,1486,1489],{},[133,1476,995],{}," to open the VBA editor (or go back if it is still open). Click anywhere inside the ",[133,1479,1480],{},"PushToDataPoint"," sub and press ",[133,1483,1484],{},"F5",", or use ",[122,1487,1488],{},"Developer → Macros → PushToDataPoint → Run"," from the ribbon.",[182,1491,1492],{},[116,1493,1494,1496,1497,1500],{},[122,1495,188],{}," If Excel shows a security prompt about connecting to an external URL, click ",[122,1498,1499],{},"Allow",".",[116,1502,1503],{},"A dialog confirms success or shows the error message from the server.",[108,1505],{},[108,1507],{},[111,1509,1511],{"id":1510},"method-3-power-automate-microsoft-365","Method 3 — Power Automate (Microsoft 365)",[182,1513,1514],{},[116,1515,1516,1519,1520,1523],{},[122,1517,1518],{},"Licence required:"," The HTTP connector used in this method is only available on ",[122,1521,1522],{},"Power Automate Premium"," (per-user or per-flow) plans. It is not available on the free tier or the basic plan included with standard Microsoft 365 subscriptions. Confirm your licencing before proceeding.",[108,1525],{},[150,1527,153],{"id":1528},"step-1-obtain-your-session-token-1",[116,1530,956,1531,959,1533,962,1535,1537],{},[133,1532,159],{},[122,1534,167],{},[133,1536,179],{}," value.",[182,1539,1540],{},[116,1541,1542,189,1544,1546,1547,1549,1550,1553,1554,206,1556,1558,1559,1561,1562,1564],{},[122,1543,188],{},[133,1545,179],{}," expires after ~1 hour, but the ",[133,1548,195],{}," lasts 60 days by default. For scheduled flows, add an HTTP action ",[122,1551,1552],{},"before"," the upload step that calls ",[133,1555,205],{},[133,1557,209],{},". Store the returned ",[133,1560,179],{}," in a variable for the upload request, and store the returned ",[133,1563,195],{}," in a Power Automate environment variable or Azure Key Vault to replace the previous one. This keeps the flow running indefinitely without manual token updates.",[108,1566],{},[150,1568,1570],{"id":1569},"step-2-create-a-new-flow","Step 2 — Create a new flow",[116,1572,1573,1574,1581,1582,1585,1586,1589,1590,1593,1594,1500],{},"Go to ",[1575,1576,1580],"a",{"href":1577,"rel":1578},"https:\u002F\u002Fmake.powerautomate.com",[1579],"nofollow","make.powerautomate.com"," and sign in. Click ",[122,1583,1584],{},"Create",", then choose ",[122,1587,1588],{},"Instant cloud flow"," (to trigger manually) or ",[122,1591,1592],{},"Scheduled cloud flow"," (for recurring uploads). Name the flow and click ",[122,1595,1584],{},[108,1597],{},[150,1599,1601],{"id":1600},"step-3-add-an-initialize-variable-action","Step 3 — Add an Initialize variable action",[116,1603,935,1604,1607,1608,1611],{},[122,1605,1606],{},"+ New step"," and search for ",[122,1609,1610],{},"Initialize variable"," (Variables connector). Set:",[1613,1614,1615,1625,1630],"ul",{},[1616,1617,1618,1621,1622],"li",{},[122,1619,1620],{},"Name"," → ",[133,1623,1624],{},"token",[1616,1626,1627,1629],{},[122,1628,575],{}," → String",[1616,1631,1632,1635,1636],{},[122,1633,1634],{},"Value"," → paste your ",[133,1637,179],{},[108,1639],{},[150,1641,1643],{"id":1642},"step-4-build-the-rows-data-with-a-compose-action","Step 4 — Build the rows data with a Compose action",[116,1645,1646,1647,1650,1651,1654,1655,1658],{},"Add a ",[122,1648,1649],{},"Compose"," action (Data Operation connector). In the ",[122,1652,1653],{},"Inputs"," field, enter your rows array as a JSON expression. If your data comes from an Excel table, use a ",[122,1656,1657],{},"Select"," action first to shape each row into the correct format, then reference its output here.",[126,1660,1662],{"className":270,"code":1661,"language":272,"meta":135,"style":135},"[\n  {\n    \"Year\": 2023,\n    \"01_max\": 8.2, \"01_min\": 2.1, \"01_rain\": 62.4,\n    \"07_max\": 24.3, \"07_min\": 13.8, \"07_rain\": 38.2\n  },\n  {\n    \"Year\": 2024,\n    \"01_max\": 7.9, \"01_min\": 1.8, \"01_rain\": 58.0\n  }\n]\n",[133,1663,1664,1669,1674,1688,1726,1768,1773,1777,1791,1827,1831],{"__ignoreMap":135},[276,1665,1666],{"class":278,"line":279},[276,1667,1668],{"class":282},"[\n",[276,1670,1671],{"class":278,"line":286},[276,1672,1673],{"class":282},"  {\n",[276,1675,1676,1678,1680,1682,1684,1686],{"class":278,"line":313},[276,1677,792],{"class":282},[276,1679,243],{"class":292},[276,1681,295],{"class":282},[276,1683,298],{"class":282},[276,1685,383],{"class":382},[276,1687,310],{"class":282},[276,1689,1690,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710,1712,1714,1716,1718,1720,1722,1724],{"class":278,"line":334},[276,1691,792],{"class":282},[276,1693,393],{"class":292},[276,1695,295],{"class":282},[276,1697,298],{"class":282},[276,1699,400],{"class":382},[276,1701,403],{"class":282},[276,1703,301],{"class":282},[276,1705,408],{"class":292},[276,1707,295],{"class":282},[276,1709,298],{"class":282},[276,1711,415],{"class":382},[276,1713,403],{"class":282},[276,1715,301],{"class":282},[276,1717,422],{"class":292},[276,1719,295],{"class":282},[276,1721,298],{"class":282},[276,1723,429],{"class":382},[276,1725,310],{"class":282},[276,1727,1728,1730,1733,1735,1737,1740,1742,1744,1747,1749,1751,1754,1756,1758,1761,1763,1765],{"class":278,"line":349},[276,1729,792],{"class":282},[276,1731,1732],{"class":292},"07_max",[276,1734,295],{"class":282},[276,1736,298],{"class":282},[276,1738,1739],{"class":382}," 24.3",[276,1741,403],{"class":282},[276,1743,301],{"class":282},[276,1745,1746],{"class":292},"07_min",[276,1748,295],{"class":282},[276,1750,298],{"class":282},[276,1752,1753],{"class":382}," 13.8",[276,1755,403],{"class":282},[276,1757,301],{"class":282},[276,1759,1760],{"class":292},"07_rain",[276,1762,295],{"class":282},[276,1764,298],{"class":282},[276,1766,1767],{"class":382}," 38.2\n",[276,1769,1770],{"class":278,"line":363},[276,1771,1772],{"class":282},"  },\n",[276,1774,1775],{"class":278,"line":369},[276,1776,1673],{"class":282},[276,1778,1779,1781,1783,1785,1787,1789],{"class":278,"line":388},[276,1780,792],{"class":282},[276,1782,243],{"class":292},[276,1784,295],{"class":282},[276,1786,298],{"class":282},[276,1788,499],{"class":382},[276,1790,310],{"class":282},[276,1792,1793,1795,1797,1799,1801,1803,1805,1807,1809,1811,1813,1815,1817,1819,1821,1823,1825],{"class":278,"line":434},[276,1794,792],{"class":282},[276,1796,393],{"class":292},[276,1798,295],{"class":282},[276,1800,298],{"class":282},[276,1802,515],{"class":382},[276,1804,403],{"class":282},[276,1806,301],{"class":282},[276,1808,408],{"class":292},[276,1810,295],{"class":282},[276,1812,298],{"class":282},[276,1814,528],{"class":382},[276,1816,403],{"class":282},[276,1818,301],{"class":282},[276,1820,422],{"class":292},[276,1822,295],{"class":282},[276,1824,298],{"class":282},[276,1826,541],{"class":382},[276,1828,1829],{"class":278,"line":477},[276,1830,895],{"class":282},[276,1832,1833],{"class":278,"line":483},[276,1834,1835],{"class":282},"]\n",[108,1837],{},[150,1839,1841],{"id":1840},"step-5-add-an-http-action","Step 5 — Add an HTTP action",[116,1843,1844,1845,1848],{},"Add a new step and search for ",[122,1846,1847],{},"HTTP"," (Premium connectors). Configure as follows:",[126,1850,1853],{"className":1851,"code":1852,"language":131},[129],"Method:   POST\nURI:      https:\u002F\u002Fdatapoint.meteomaps.com\u002Ffunctions\u002Fv1\u002Fingest-dataset\n\nHeaders:\n  Authorization:   Bearer @{variables('token')}\n  Content-Type:    application\u002Fjson\n\nBody:\n  {\n    \"name\": \"My Flow Export\",\n    \"description\": \"Automated upload from Power Automate\",\n    \"is_public\": true,\n    \"rows\": @{outputs('Compose')}\n  }\n",[133,1854,1852],{"__ignoreMap":135},[116,1856,1857,1858,1860,1861,1537],{},"In the Body field, use the dynamic content picker to reference the ",[122,1859,1649],{}," output for the ",[133,1862,236],{},[108,1864],{},[150,1866,1868],{"id":1867},"step-6-parse-the-response-optional","Step 6 — Parse the response (optional)",[116,1870,1646,1871,1874,1875,1878,1879,1882,1883,1886],{},[122,1872,1873],{},"Parse JSON"," action (Data Operation connector). Set ",[122,1876,1877],{},"Content"," to the ",[122,1880,1881],{},"Body"," output of the HTTP action. Click ",[122,1884,1885],{},"Generate from sample"," and paste this example response:",[126,1888,1890],{"className":270,"code":1889,"language":272,"meta":135,"style":135},"{\n  \"type\": \"object\",\n  \"properties\": {\n    \"success\": { \"type\": \"boolean\" },\n    \"dataset\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\":          { \"type\": \"string\" },\n        \"name\":        { \"type\": \"string\" },\n        \"rowCount\":    { \"type\": \"integer\" },\n        \"columnCount\": { \"type\": \"integer\" },\n        \"isPublic\":    { \"type\": \"boolean\" },\n        \"createdAt\":   { \"type\": \"string\" }\n      }\n    }\n  }\n}\n",[133,1891,1892,1896,1916,1929,1959,1971,1989,2001,2033,2062,2092,2120,2148,2178,2183,2187,2191],{"__ignoreMap":135},[276,1893,1894],{"class":278,"line":279},[276,1895,283],{"class":282},[276,1897,1898,1900,1903,1905,1907,1909,1912,1914],{"class":278,"line":286},[276,1899,289],{"class":282},[276,1901,1902],{"class":292},"type",[276,1904,295],{"class":282},[276,1906,298],{"class":282},[276,1908,301],{"class":282},[276,1910,1911],{"class":304},"object",[276,1913,295],{"class":282},[276,1915,310],{"class":282},[276,1917,1918,1920,1923,1925,1927],{"class":278,"line":313},[276,1919,289],{"class":282},[276,1921,1922],{"class":292},"properties",[276,1924,295],{"class":282},[276,1926,298],{"class":282},[276,1928,787],{"class":282},[276,1930,1931,1933,1935,1937,1939,1942,1944,1946,1948,1950,1952,1954,1956],{"class":278,"line":334},[276,1932,792],{"class":282},[276,1934,767],{"class":375},[276,1936,295],{"class":282},[276,1938,298],{"class":282},[276,1940,1941],{"class":282}," {",[276,1943,301],{"class":282},[276,1945,1902],{"class":382},[276,1947,295],{"class":282},[276,1949,298],{"class":282},[276,1951,301],{"class":282},[276,1953,622],{"class":304},[276,1955,295],{"class":282},[276,1957,1958],{"class":282}," },\n",[276,1960,1961,1963,1965,1967,1969],{"class":278,"line":349},[276,1962,792],{"class":282},[276,1964,780],{"class":375},[276,1966,295],{"class":282},[276,1968,298],{"class":282},[276,1970,787],{"class":282},[276,1972,1973,1975,1977,1979,1981,1983,1985,1987],{"class":278,"line":363},[276,1974,372],{"class":282},[276,1976,1902],{"class":382},[276,1978,295],{"class":282},[276,1980,298],{"class":282},[276,1982,301],{"class":282},[276,1984,1911],{"class":304},[276,1986,295],{"class":282},[276,1988,310],{"class":282},[276,1990,1991,1993,1995,1997,1999],{"class":278,"line":369},[276,1992,372],{"class":282},[276,1994,1922],{"class":382},[276,1996,295],{"class":282},[276,1998,298],{"class":282},[276,2000,787],{"class":282},[276,2002,2003,2006,2009,2011,2013,2016,2018,2021,2023,2025,2027,2029,2031],{"class":278,"line":388},[276,2004,2005],{"class":282},"        \"",[276,2007,795],{"class":2008},"swJcz",[276,2010,295],{"class":282},[276,2012,298],{"class":282},[276,2014,2015],{"class":282},"          {",[276,2017,301],{"class":282},[276,2019,1902],{"class":2020},"su27w",[276,2022,295],{"class":282},[276,2024,298],{"class":282},[276,2026,301],{"class":282},[276,2028,594],{"class":304},[276,2030,295],{"class":282},[276,2032,1958],{"class":282},[276,2034,2035,2037,2039,2041,2043,2046,2048,2050,2052,2054,2056,2058,2060],{"class":278,"line":434},[276,2036,2005],{"class":282},[276,2038,232],{"class":2008},[276,2040,295],{"class":282},[276,2042,298],{"class":282},[276,2044,2045],{"class":282},"        {",[276,2047,301],{"class":282},[276,2049,1902],{"class":2020},[276,2051,295],{"class":282},[276,2053,298],{"class":282},[276,2055,301],{"class":282},[276,2057,594],{"class":304},[276,2059,295],{"class":282},[276,2061,1958],{"class":282},[276,2063,2064,2066,2068,2070,2072,2075,2077,2079,2081,2083,2085,2088,2090],{"class":278,"line":477},[276,2065,2005],{"class":282},[276,2067,833],{"class":2008},[276,2069,295],{"class":282},[276,2071,298],{"class":282},[276,2073,2074],{"class":282},"    {",[276,2076,301],{"class":282},[276,2078,1902],{"class":2020},[276,2080,295],{"class":282},[276,2082,298],{"class":282},[276,2084,301],{"class":282},[276,2086,2087],{"class":304},"integer",[276,2089,295],{"class":282},[276,2091,1958],{"class":282},[276,2093,2094,2096,2098,2100,2102,2104,2106,2108,2110,2112,2114,2116,2118],{"class":278,"line":483},[276,2095,2005],{"class":282},[276,2097,849],{"class":2008},[276,2099,295],{"class":282},[276,2101,298],{"class":282},[276,2103,1941],{"class":282},[276,2105,301],{"class":282},[276,2107,1902],{"class":2020},[276,2109,295],{"class":282},[276,2111,298],{"class":282},[276,2113,301],{"class":282},[276,2115,2087],{"class":304},[276,2117,295],{"class":282},[276,2119,1958],{"class":282},[276,2121,2122,2124,2126,2128,2130,2132,2134,2136,2138,2140,2142,2144,2146],{"class":278,"line":488},[276,2123,2005],{"class":282},[276,2125,865],{"class":2008},[276,2127,295],{"class":282},[276,2129,298],{"class":282},[276,2131,2074],{"class":282},[276,2133,301],{"class":282},[276,2135,1902],{"class":2020},[276,2137,295],{"class":282},[276,2139,298],{"class":282},[276,2141,301],{"class":282},[276,2143,622],{"class":304},[276,2145,295],{"class":282},[276,2147,1958],{"class":282},[276,2149,2150,2152,2154,2156,2158,2161,2163,2165,2167,2169,2171,2173,2175],{"class":278,"line":504},[276,2151,2005],{"class":282},[276,2153,878],{"class":2008},[276,2155,295],{"class":282},[276,2157,298],{"class":282},[276,2159,2160],{"class":282},"   {",[276,2162,301],{"class":282},[276,2164,1902],{"class":2020},[276,2166,295],{"class":282},[276,2168,298],{"class":282},[276,2170,301],{"class":282},[276,2172,594],{"class":304},[276,2174,295],{"class":282},[276,2176,2177],{"class":282}," }\n",[276,2179,2180],{"class":278,"line":544},[276,2181,2182],{"class":282},"      }\n",[276,2184,2185],{"class":278,"line":550},[276,2186,547],{"class":282},[276,2188,2189],{"class":278,"line":556},[276,2190,895],{"class":282},[276,2192,2193],{"class":278,"line":1111},[276,2194,559],{"class":282},[116,2196,2197],{},"This makes the dataset fields available as dynamic content in subsequent actions.",[108,2199],{},[150,2201,2203],{"id":2202},"step-7-test-and-save","Step 7 — Test and save",[116,2205,935,2206,2209,2210,2213],{},[122,2207,2208],{},"Save",", then click ",[122,2211,2212],{},"Test → Manually → Test",". Power Automate runs the flow and shows a tick or error on each action. Expand the HTTP action to confirm the dataset ID in the response body.",[182,2215,2216],{},[116,2217,2218,2221,2222,2225,2226,2229],{},[122,2219,2220],{},"Tip:"," Add a ",[122,2223,2224],{},"Send an email"," or ",[122,2227,2228],{},"Post a Teams message"," action after the HTTP step to notify your team when an upload succeeds.",[108,2231],{},[108,2233],{},[111,2235,2237],{"id":2236},"method-4-google-apps-script-google-sheets","Method 4 — Google Apps Script (Google Sheets)",[116,2239,2240],{},"Free and built into every Google Sheet. No extensions or billing required.",[108,2242],{},[150,2244,2246],{"id":2245},"step-1-open-the-apps-script-editor","Step 1 — Open the Apps Script editor",[116,2248,2249,2250,2253,2254,2257],{},"Open the Google Sheet containing your data. Click ",[122,2251,2252],{},"Extensions → Apps Script",". The editor opens in a new tab. If you see a default ",[133,2255,2256],{},"myFunction",", delete it.",[108,2259],{},[150,2261,953],{"id":2262},"step-2-obtain-your-session-token-1",[116,2264,2265,2266,959,2268,962,2270,1537],{},"In another browser tab, sign in to DataPoint. Press ",[133,2267,159],{},[122,2269,167],{},[133,2271,179],{},[182,2273,2274],{},[116,2275,2276,189,2278,2280,2281,2284,2285,2287,2288,2291,2292,2294,2295,2298,2299,2301,2302,2304],{},[122,2277,188],{},[133,2279,179],{}," expires after ~1 hour. For one-off or manual runs this is fine — just re-copy a fresh token if you get a 401. For daily or monthly automated triggers (set up via ",[122,2282,2283],{},"Extensions → Apps Script → Triggers","), store your ",[133,2286,195],{}," in ",[133,2289,2290],{},"PropertiesService.getScriptProperties()"," instead of hardcoding the ",[133,2293,179],{},". Before each upload, call the refresh endpoint (",[133,2296,2297],{},"POST ...\u002Fauth\u002Fv1\u002Ftoken?grant_type=refresh_token","), extract the new ",[133,2300,179],{}," and new ",[133,2303,195],{}," from the response, update the stored refresh token, and then proceed with the upload. The refresh token is valid for 60 days and is rotated on every use, so the script keeps working indefinitely.",[108,2306],{},[150,2308,2310],{"id":2309},"step-3-paste-the-script","Step 3 — Paste the script",[116,2312,2313,2314,2317],{},"Replace all content in ",[133,2315,2316],{},"Code.gs"," with the following:",[126,2319,2323],{"className":2320,"code":2321,"language":2322,"meta":135,"style":135},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","function pushToDataPoint() {\n  var TOKEN = 'YOUR_ACCESS_TOKEN_HERE'; \u002F\u002F replace with your token\n\n  var payload = {\n    name: 'My Sheet Export - ' + new Date().toLocaleDateString(),\n    description: 'Automated export from Google Sheets',\n    is_public: true,\n    rows: buildRowsFromSheet()\n  };\n\n  var options = {\n    method: 'post',\n    contentType: 'application\u002Fjson',\n    headers: { 'Authorization': 'Bearer ' + TOKEN },\n    payload: JSON.stringify(payload),\n    muteHttpExceptions: true\n  };\n\n  var response = UrlFetchApp.fetch(\n    'https:\u002F\u002Fdatapoint.meteomaps.com\u002Ffunctions\u002Fv1\u002Fingest-dataset',\n    options\n  );\n  var result = JSON.parse(response.getContentText());\n\n  if (result.success) {\n    SpreadsheetApp.getUi().alert(\n      'Upload successful!\\n' +\n      result.dataset.rowCount + ' rows uploaded.\\n' +\n      'Dataset ID: ' + result.dataset.id\n    );\n  } else {\n    SpreadsheetApp.getUi().alert('Upload failed: ' + result.error);\n  }\n}\n\nfunction buildRowsFromSheet() {\n  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();\n  var data = sheet.getDataRange().getValues();\n  var headers = data[0];\n  var rows = [];\n\n  for (var i = 1; i \u003C data.length; i++) {\n    var row = {};\n    for (var j = 0; j \u003C headers.length; j++) {\n      if (data[i][j] !== '') {\n        row[headers[j]] = data[i][j];\n      }\n    }\n    if (Object.keys(row).length > 0) {\n      rows.push(row);\n    }\n  }\n\n  return rows;\n}\n","javascript",[133,2324,2325,2339,2364,2368,2379,2413,2429,2442,2455,2460,2464,2475,2491,2507,2538,2564,2574,2578,2582,2602,2613,2618,2626,2657,2661,2682,2701,2717,2743,2765,2772,2781,2816,2820,2824,2828,2838,2866,2893,2915,2929,2933,2976,2989,3028,3062,3096,3100,3104,3139,3157,3161,3165,3169,3178],{"__ignoreMap":135},[276,2326,2327,2330,2334,2337],{"class":278,"line":279},[276,2328,2329],{"class":292},"function",[276,2331,2333],{"class":2332},"s2Zo4"," pushToDataPoint",[276,2335,2336],{"class":282},"()",[276,2338,787],{"class":282},[276,2340,2341,2344,2347,2350,2352,2354,2357,2360],{"class":278,"line":286},[276,2342,2343],{"class":292},"  var",[276,2345,2346],{"class":681}," TOKEN",[276,2348,2349],{"class":282}," =",[276,2351,717],{"class":282},[276,2353,1446],{"class":304},[276,2355,2356],{"class":282},"'",[276,2358,2359],{"class":282},";",[276,2361,2363],{"class":2362},"sHwdD"," \u002F\u002F replace with your token\n",[276,2365,2366],{"class":278,"line":313},[276,2367,1050],{"emptyLinePlaceholder":1049},[276,2369,2370,2372,2375,2377],{"class":278,"line":334},[276,2371,2343],{"class":292},[276,2373,2374],{"class":681}," payload",[276,2376,2349],{"class":282},[276,2378,787],{"class":282},[276,2380,2381,2384,2386,2388,2391,2393,2396,2399,2402,2404,2406,2409,2411],{"class":278,"line":349},[276,2382,2383],{"class":2008},"    name",[276,2385,298],{"class":282},[276,2387,717],{"class":282},[276,2389,2390],{"class":304},"My Sheet Export - ",[276,2392,2356],{"class":282},[276,2394,2395],{"class":282}," +",[276,2397,2398],{"class":282}," new",[276,2400,2401],{"class":2332}," Date",[276,2403,2336],{"class":2008},[276,2405,1500],{"class":282},[276,2407,2408],{"class":2332},"toLocaleDateString",[276,2410,2336],{"class":2008},[276,2412,310],{"class":282},[276,2414,2415,2418,2420,2422,2425,2427],{"class":278,"line":363},[276,2416,2417],{"class":2008},"    description",[276,2419,298],{"class":282},[276,2421,717],{"class":282},[276,2423,2424],{"class":304},"Automated export from Google Sheets",[276,2426,2356],{"class":282},[276,2428,310],{"class":282},[276,2430,2431,2434,2436,2440],{"class":278,"line":369},[276,2432,2433],{"class":2008},"    is_public",[276,2435,298],{"class":282},[276,2437,2439],{"class":2438},"sfNiH"," true",[276,2441,310],{"class":282},[276,2443,2444,2447,2449,2452],{"class":278,"line":388},[276,2445,2446],{"class":2008},"    rows",[276,2448,298],{"class":282},[276,2450,2451],{"class":2332}," buildRowsFromSheet",[276,2453,2454],{"class":2008},"()\n",[276,2456,2457],{"class":278,"line":434},[276,2458,2459],{"class":282},"  };\n",[276,2461,2462],{"class":278,"line":477},[276,2463,1050],{"emptyLinePlaceholder":1049},[276,2465,2466,2468,2471,2473],{"class":278,"line":483},[276,2467,2343],{"class":292},[276,2469,2470],{"class":681}," options",[276,2472,2349],{"class":282},[276,2474,787],{"class":282},[276,2476,2477,2480,2482,2484,2487,2489],{"class":278,"line":488},[276,2478,2479],{"class":2008},"    method",[276,2481,298],{"class":282},[276,2483,717],{"class":282},[276,2485,2486],{"class":304},"post",[276,2488,2356],{"class":282},[276,2490,310],{"class":282},[276,2492,2493,2496,2498,2500,2503,2505],{"class":278,"line":504},[276,2494,2495],{"class":2008},"    contentType",[276,2497,298],{"class":282},[276,2499,717],{"class":282},[276,2501,2502],{"class":304},"application\u002Fjson",[276,2504,2356],{"class":282},[276,2506,310],{"class":282},[276,2508,2509,2512,2514,2516,2518,2521,2523,2525,2527,2530,2532,2534,2536],{"class":278,"line":544},[276,2510,2511],{"class":2008},"    headers",[276,2513,298],{"class":282},[276,2515,1941],{"class":282},[276,2517,717],{"class":282},[276,2519,2520],{"class":2008},"Authorization",[276,2522,2356],{"class":282},[276,2524,298],{"class":282},[276,2526,717],{"class":282},[276,2528,2529],{"class":304},"Bearer ",[276,2531,2356],{"class":282},[276,2533,2395],{"class":282},[276,2535,2346],{"class":681},[276,2537,1958],{"class":282},[276,2539,2540,2543,2545,2548,2550,2553,2556,2559,2562],{"class":278,"line":550},[276,2541,2542],{"class":2008},"    payload",[276,2544,298],{"class":282},[276,2546,2547],{"class":681}," JSON",[276,2549,1500],{"class":282},[276,2551,2552],{"class":2332},"stringify",[276,2554,2555],{"class":2008},"(",[276,2557,2558],{"class":681},"payload",[276,2560,2561],{"class":2008},")",[276,2563,310],{"class":282},[276,2565,2566,2569,2571],{"class":278,"line":556},[276,2567,2568],{"class":2008},"    muteHttpExceptions",[276,2570,298],{"class":282},[276,2572,2573],{"class":2438}," true\n",[276,2575,2576],{"class":278,"line":1111},[276,2577,2459],{"class":282},[276,2579,2580],{"class":278,"line":1117},[276,2581,1050],{"emptyLinePlaceholder":1049},[276,2583,2584,2586,2589,2591,2594,2596,2599],{"class":278,"line":1123},[276,2585,2343],{"class":292},[276,2587,2588],{"class":681}," response",[276,2590,2349],{"class":282},[276,2592,2593],{"class":681}," UrlFetchApp",[276,2595,1500],{"class":282},[276,2597,2598],{"class":2332},"fetch",[276,2600,2601],{"class":2008},"(\n",[276,2603,2604,2607,2609,2611],{"class":278,"line":1128},[276,2605,2606],{"class":282},"    '",[276,2608,676],{"class":304},[276,2610,2356],{"class":282},[276,2612,310],{"class":282},[276,2614,2615],{"class":278,"line":1134},[276,2616,2617],{"class":681},"    options\n",[276,2619,2620,2623],{"class":278,"line":1140},[276,2621,2622],{"class":2008},"  )",[276,2624,2625],{"class":282},";\n",[276,2627,2628,2630,2633,2635,2637,2639,2642,2644,2647,2649,2652,2655],{"class":278,"line":1146},[276,2629,2343],{"class":292},[276,2631,2632],{"class":681}," result",[276,2634,2349],{"class":282},[276,2636,2547],{"class":681},[276,2638,1500],{"class":282},[276,2640,2641],{"class":2332},"parse",[276,2643,2555],{"class":2008},[276,2645,2646],{"class":681},"response",[276,2648,1500],{"class":282},[276,2650,2651],{"class":2332},"getContentText",[276,2653,2654],{"class":2008},"())",[276,2656,2625],{"class":282},[276,2658,2659],{"class":278,"line":1152},[276,2660,1050],{"emptyLinePlaceholder":1049},[276,2662,2663,2667,2670,2673,2675,2677,2680],{"class":278,"line":1158},[276,2664,2666],{"class":2665},"s7zQu","  if",[276,2668,2669],{"class":2008}," (",[276,2671,2672],{"class":681},"result",[276,2674,1500],{"class":282},[276,2676,767],{"class":681},[276,2678,2679],{"class":2008},") ",[276,2681,283],{"class":282},[276,2683,2684,2687,2689,2692,2694,2696,2699],{"class":278,"line":1164},[276,2685,2686],{"class":681},"    SpreadsheetApp",[276,2688,1500],{"class":282},[276,2690,2691],{"class":2332},"getUi",[276,2693,2336],{"class":2008},[276,2695,1500],{"class":282},[276,2697,2698],{"class":2332},"alert",[276,2700,2601],{"class":2008},[276,2702,2703,2706,2709,2712,2714],{"class":278,"line":1170},[276,2704,2705],{"class":282},"      '",[276,2707,2708],{"class":304},"Upload successful!",[276,2710,2711],{"class":681},"\\n",[276,2713,2356],{"class":282},[276,2715,2716],{"class":282}," +\n",[276,2718,2719,2722,2724,2726,2728,2730,2732,2734,2737,2739,2741],{"class":278,"line":1176},[276,2720,2721],{"class":681},"      result",[276,2723,1500],{"class":282},[276,2725,780],{"class":681},[276,2727,1500],{"class":282},[276,2729,833],{"class":681},[276,2731,2395],{"class":282},[276,2733,717],{"class":282},[276,2735,2736],{"class":304}," rows uploaded.",[276,2738,2711],{"class":681},[276,2740,2356],{"class":282},[276,2742,2716],{"class":282},[276,2744,2745,2747,2750,2752,2754,2756,2758,2760,2762],{"class":278,"line":1182},[276,2746,2705],{"class":282},[276,2748,2749],{"class":304},"Dataset ID: ",[276,2751,2356],{"class":282},[276,2753,2395],{"class":282},[276,2755,2632],{"class":681},[276,2757,1500],{"class":282},[276,2759,780],{"class":681},[276,2761,1500],{"class":282},[276,2763,2764],{"class":681},"id\n",[276,2766,2767,2770],{"class":278,"line":1188},[276,2768,2769],{"class":2008},"    )",[276,2771,2625],{"class":282},[276,2773,2774,2776,2779],{"class":278,"line":1194},[276,2775,739],{"class":282},[276,2777,2778],{"class":2665}," else",[276,2780,787],{"class":282},[276,2782,2783,2785,2787,2789,2791,2793,2795,2797,2799,2802,2804,2806,2808,2810,2812,2814],{"class":278,"line":1200},[276,2784,2686],{"class":681},[276,2786,1500],{"class":282},[276,2788,2691],{"class":2332},[276,2790,2336],{"class":2008},[276,2792,1500],{"class":282},[276,2794,2698],{"class":2332},[276,2796,2555],{"class":2008},[276,2798,2356],{"class":282},[276,2800,2801],{"class":304},"Upload failed: ",[276,2803,2356],{"class":282},[276,2805,2395],{"class":282},[276,2807,2632],{"class":681},[276,2809,1500],{"class":282},[276,2811,905],{"class":681},[276,2813,2561],{"class":2008},[276,2815,2625],{"class":282},[276,2817,2818],{"class":278,"line":1206},[276,2819,895],{"class":282},[276,2821,2822],{"class":278,"line":1212},[276,2823,559],{"class":282},[276,2825,2826],{"class":278,"line":1218},[276,2827,1050],{"emptyLinePlaceholder":1049},[276,2829,2830,2832,2834,2836],{"class":278,"line":1224},[276,2831,2329],{"class":292},[276,2833,2451],{"class":2332},[276,2835,2336],{"class":282},[276,2837,787],{"class":282},[276,2839,2840,2842,2845,2847,2850,2852,2855,2857,2859,2862,2864],{"class":278,"line":1230},[276,2841,2343],{"class":292},[276,2843,2844],{"class":681}," sheet",[276,2846,2349],{"class":282},[276,2848,2849],{"class":681}," SpreadsheetApp",[276,2851,1500],{"class":282},[276,2853,2854],{"class":2332},"getActiveSpreadsheet",[276,2856,2336],{"class":2008},[276,2858,1500],{"class":282},[276,2860,2861],{"class":2332},"getActiveSheet",[276,2863,2336],{"class":2008},[276,2865,2625],{"class":282},[276,2867,2868,2870,2873,2875,2877,2879,2882,2884,2886,2889,2891],{"class":278,"line":1236},[276,2869,2343],{"class":292},[276,2871,2872],{"class":681}," data",[276,2874,2349],{"class":282},[276,2876,2844],{"class":681},[276,2878,1500],{"class":282},[276,2880,2881],{"class":2332},"getDataRange",[276,2883,2336],{"class":2008},[276,2885,1500],{"class":282},[276,2887,2888],{"class":2332},"getValues",[276,2890,2336],{"class":2008},[276,2892,2625],{"class":282},[276,2894,2895,2897,2900,2902,2904,2907,2910,2913],{"class":278,"line":1242},[276,2896,2343],{"class":292},[276,2898,2899],{"class":681}," headers",[276,2901,2349],{"class":282},[276,2903,2872],{"class":681},[276,2905,2906],{"class":2008},"[",[276,2908,2909],{"class":382},"0",[276,2911,2912],{"class":2008},"]",[276,2914,2625],{"class":282},[276,2916,2917,2919,2922,2924,2927],{"class":278,"line":1248},[276,2918,2343],{"class":292},[276,2920,2921],{"class":681}," rows",[276,2923,2349],{"class":282},[276,2925,2926],{"class":2008}," []",[276,2928,2625],{"class":282},[276,2930,2931],{"class":278,"line":1254},[276,2932,1050],{"emptyLinePlaceholder":1049},[276,2934,2935,2938,2940,2943,2946,2948,2951,2953,2955,2958,2960,2962,2965,2967,2969,2972,2974],{"class":278,"line":1260},[276,2936,2937],{"class":2665},"  for",[276,2939,2669],{"class":2008},[276,2941,2942],{"class":292},"var",[276,2944,2945],{"class":681}," i",[276,2947,2349],{"class":282},[276,2949,2950],{"class":382}," 1",[276,2952,2359],{"class":282},[276,2954,2945],{"class":681},[276,2956,2957],{"class":282}," \u003C",[276,2959,2872],{"class":681},[276,2961,1500],{"class":282},[276,2963,2964],{"class":681},"length",[276,2966,2359],{"class":282},[276,2968,2945],{"class":681},[276,2970,2971],{"class":282},"++",[276,2973,2679],{"class":2008},[276,2975,283],{"class":282},[276,2977,2978,2981,2984,2986],{"class":278,"line":1266},[276,2979,2980],{"class":292},"    var",[276,2982,2983],{"class":681}," row",[276,2985,2349],{"class":282},[276,2987,2988],{"class":282}," {};\n",[276,2990,2991,2994,2996,2998,3001,3003,3006,3008,3010,3012,3014,3016,3018,3020,3022,3024,3026],{"class":278,"line":1272},[276,2992,2993],{"class":2665},"    for",[276,2995,2669],{"class":2008},[276,2997,2942],{"class":292},[276,2999,3000],{"class":681}," j",[276,3002,2349],{"class":282},[276,3004,3005],{"class":382}," 0",[276,3007,2359],{"class":282},[276,3009,3000],{"class":681},[276,3011,2957],{"class":282},[276,3013,2899],{"class":681},[276,3015,1500],{"class":282},[276,3017,2964],{"class":681},[276,3019,2359],{"class":282},[276,3021,3000],{"class":681},[276,3023,2971],{"class":282},[276,3025,2679],{"class":2008},[276,3027,283],{"class":282},[276,3029,3030,3033,3035,3038,3040,3043,3046,3049,3052,3055,3058,3060],{"class":278,"line":1278},[276,3031,3032],{"class":2665},"      if",[276,3034,2669],{"class":2008},[276,3036,3037],{"class":681},"data",[276,3039,2906],{"class":2008},[276,3041,3042],{"class":681},"i",[276,3044,3045],{"class":2008},"][",[276,3047,3048],{"class":681},"j",[276,3050,3051],{"class":2008},"] ",[276,3053,3054],{"class":282},"!==",[276,3056,3057],{"class":282}," ''",[276,3059,2679],{"class":2008},[276,3061,283],{"class":282},[276,3063,3064,3067,3069,3072,3074,3076,3079,3082,3084,3086,3088,3090,3092,3094],{"class":278,"line":1284},[276,3065,3066],{"class":681},"        row",[276,3068,2906],{"class":2008},[276,3070,3071],{"class":681},"headers",[276,3073,2906],{"class":2008},[276,3075,3048],{"class":681},[276,3077,3078],{"class":2008},"]] ",[276,3080,3081],{"class":282},"=",[276,3083,2872],{"class":681},[276,3085,2906],{"class":2008},[276,3087,3042],{"class":681},[276,3089,3045],{"class":2008},[276,3091,3048],{"class":681},[276,3093,2912],{"class":2008},[276,3095,2625],{"class":282},[276,3097,3098],{"class":278,"line":1290},[276,3099,2182],{"class":282},[276,3101,3102],{"class":278,"line":1296},[276,3103,547],{"class":282},[276,3105,3106,3109,3111,3114,3116,3119,3121,3124,3126,3128,3130,3133,3135,3137],{"class":278,"line":1301},[276,3107,3108],{"class":2665},"    if",[276,3110,2669],{"class":2008},[276,3112,3113],{"class":681},"Object",[276,3115,1500],{"class":282},[276,3117,3118],{"class":2332},"keys",[276,3120,2555],{"class":2008},[276,3122,3123],{"class":681},"row",[276,3125,2561],{"class":2008},[276,3127,1500],{"class":282},[276,3129,2964],{"class":681},[276,3131,3132],{"class":282}," >",[276,3134,3005],{"class":382},[276,3136,2679],{"class":2008},[276,3138,283],{"class":282},[276,3140,3141,3144,3146,3149,3151,3153,3155],{"class":278,"line":1307},[276,3142,3143],{"class":681},"      rows",[276,3145,1500],{"class":282},[276,3147,3148],{"class":2332},"push",[276,3150,2555],{"class":2008},[276,3152,3123],{"class":681},[276,3154,2561],{"class":2008},[276,3156,2625],{"class":282},[276,3158,3159],{"class":278,"line":1313},[276,3160,547],{"class":282},[276,3162,3163],{"class":278,"line":1319},[276,3164,895],{"class":282},[276,3166,3167],{"class":278,"line":1325},[276,3168,1050],{"emptyLinePlaceholder":1049},[276,3170,3171,3174,3176],{"class":278,"line":1331},[276,3172,3173],{"class":2665},"  return",[276,3175,2921],{"class":681},[276,3177,2625],{"class":282},[276,3179,3180],{"class":278,"line":1337},[276,3181,559],{"class":282},[108,3183],{},[150,3185,3187],{"id":3186},"step-4-replace-the-token-placeholder","Step 4 — Replace the token placeholder",[116,3189,1443,3190,3192],{},[133,3191,1446],{}," (keep the surrounding single quotes) with the token you copied in step 2.",[108,3194],{},[150,3196,3198],{"id":3197},"step-5-prepare-your-spreadsheet","Step 5 — Prepare your spreadsheet",[116,3200,1456,3201,1459,3203,248,3205,248,3207,3209],{},[133,3202,243],{},[133,3204,247],{},[133,3206,251],{},[133,3208,254],{}," convention. Data starts from row 2. Empty cells are skipped automatically — you do not need to fill every column for every year.",[108,3211],{},[150,3213,3215],{"id":3214},"step-6-save-and-run","Step 6 — Save and run",[116,3217,992,3218,2669,3221,3224,3225,3228,3229,2209,3232,3234,3235,3238],{},[133,3219,3220],{},"Ctrl+S",[133,3222,3223],{},"Cmd+S"," on Mac) to save. Confirm the function dropdown next to the ",[122,3226,3227],{},"Run"," button says ",[133,3230,3231],{},"pushToDataPoint",[122,3233,3227],{}," (or press ",[133,3236,3237],{},"Ctrl+R",").",[108,3240],{},[150,3242,3244],{"id":3243},"step-7-authorise-the-script","Step 7 — Authorise the script",[116,3246,3247,3248,3251,3252,3259,3260,3262],{},"The first time you run the script, Google asks for permission. Click ",[122,3249,3250],{},"Review permissions",", select your account, click ",[122,3253,3254,3255,3258],{},"Advanced → Go to ",[276,3256,3257],{},"script name"," (unsafe)"," (this warning is normal for scripts you wrote yourself), then click ",[122,3261,1499],{},". The authorisation is remembered for future runs.",[182,3264,3265],{},[116,3266,3267,3269,3270,3273,3274,3277],{},[122,3268,188],{}," The script only requests permission for ",[133,3271,3272],{},"UrlFetchApp"," (to call the DataPoint API) and ",[133,3275,3276],{},"SpreadsheetApp.getUi"," (to show the result dialog).",[108,3279],{},[150,3281,3283],{"id":3282},"step-8-confirm-the-result","Step 8 — Confirm the result",[116,3285,3286],{},"Switch back to your Google Sheet tab. A dialog appears showing the number of rows uploaded and the dataset ID. Open DataPoint and check the Directory to find your new dataset.",[3288,3289,3290],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .su27w, html code.shiki .su27w{--shiki-light:#916B53;--shiki-default:#916B53;--shiki-dark:#916B53}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":135,"searchDepth":286,"depth":286,"links":3292},[3293,3300,3310,3319],{"id":113,"depth":286,"text":114,"children":3294},[3295,3296,3297,3298,3299],{"id":152,"depth":313,"text":153},{"id":225,"depth":313,"text":226},{"id":652,"depth":313,"text":653},{"id":747,"depth":313,"text":748},{"id":911,"depth":313,"text":912},{"id":922,"depth":286,"text":923,"children":3301},[3302,3303,3304,3305,3306,3307,3308,3309],{"id":931,"depth":313,"text":932},{"id":952,"depth":313,"text":953},{"id":988,"depth":313,"text":989},{"id":1005,"depth":313,"text":1006},{"id":1018,"depth":313,"text":1019},{"id":1439,"depth":313,"text":1440},{"id":1452,"depth":313,"text":1453},{"id":1471,"depth":313,"text":1472},{"id":1510,"depth":286,"text":1511,"children":3311},[3312,3313,3314,3315,3316,3317,3318],{"id":1528,"depth":313,"text":153},{"id":1569,"depth":313,"text":1570},{"id":1600,"depth":313,"text":1601},{"id":1642,"depth":313,"text":1643},{"id":1840,"depth":313,"text":1841},{"id":1867,"depth":313,"text":1868},{"id":2202,"depth":313,"text":2203},{"id":2236,"depth":286,"text":2237,"children":3320},[3321,3322,3323,3324,3325,3326,3327,3328],{"id":2245,"depth":313,"text":2246},{"id":2262,"depth":313,"text":953},{"id":2309,"depth":313,"text":2310},{"id":3186,"depth":313,"text":3187},{"id":3197,"depth":313,"text":3198},{"id":3214,"depth":313,"text":3215},{"id":3243,"depth":313,"text":3244},{"id":3282,"depth":313,"text":3283},"md",null,{},{"title":91,"description":135},"CY_zxjIQEAr9KyGYV6U8IS_hStz8fM1IVFSv03qHUqU",[3335,3337],{"title":87,"path":88,"stem":89,"description":3336,"icon":14,"children":-1},"Guide on the controls and hidden features of our CET dashboard",{"title":95,"path":96,"stem":97,"description":3338,"icon":14,"children":-1},"A quick guide to our MeteoMaps DataPoint",1777575394024]