Skip to content

Home

Making API call from Google Sheet

Welcome back to Continuous Improvement, the podcast where we explore different strategies and techniques to enhance our productivity and achieve constant growth. I'm your host, Victor, and today we have an exciting topic for all our business users out there who love working with spreadsheets. We'll be discussing how to write simple scripts in Google Sheets to revolutionize your data analysis and make powerful API calls. So, let's dive right in!

Picture this scenario: you're a business user who loves using Excel as your go-to tool. You're comfortable writing functions, calculating in spreadsheets, and even creating visualizations. But what if I told you that you can take it a step further and make API calls directly from Google Sheets? No coding required! In this episode, I'll guide you through the process of writing simple scripts to fetch data from APIs, enabling you to perform more powerful tabulations and analysis. And the best part? It's all done within the user-friendly environment of Google Sheets. No need for complex installations!

Firstly, open a new blank Google Sheet. We'll use two cells as input coordinates. In this example, I'll let B1 and B2 represent variables for datetime and date, respectively.

Secondly, to create a button, click on "Insert" in the top navigation toolbar, then select "Drawing." Draw a rectangular button labeled "Get Air Temperature." Save and close the drawing to create the button.

Next, right-click on the newly created button and select "Assign a script." For now, let's input the value "getAirTemperature." We'll create the method for this script later.

Moving on, in the navigation bar, select "Extensions" and then "App Scripts." Here, we'll write JavaScript code to perform the magic, similar to creating a Visual Basic macro script in Microsoft Excel.

In the code editor, copy and paste the provided script. Don't worry if you don't understand all the details—we'll go through it together. This script acts as a trigger when the button is clicked. It retrieves input values from the Google Sheet, prompts the user for confirmation, makes an API call using the UrlFetchApp.fetch function, and displays the output in the spreadsheet.

The first time you click on the button, you'll be prompted to give permission for this custom script to run. Since this is for development purposes, click "Continue," log in, and choose the option to continue with unsafe settings.

Next, an alert will pop up asking for confirmation of the input values retrieved from the Google Sheet. Click "Yes" to continue. If everything goes well, you should see a success confirmation. The temperature values from the API call are then displayed in the Google Sheet.

If you're a developer rather than a business user and prefer working with your own code editor, such as VScode, you can edit the script in a more familiar environment. You can even use the command-line interface tool called "clasp" to develop locally. This allows for better source version control. To get started, make sure you have Node.js installed and run the following command in your terminal:

npm install @google/clasp

Then follow the instructions in the documentation, specifically the guide for clasp, to set it up. Once you've installed clasp and configured it, you can clone your script using the command:

clasp clone <your Script ID>

You can then make changes in your preferred code editor, such as VScode, and upload the new AppScript using:

clasp push

Note that you may need to enable the Apps Script API by visiting https://script.google.com/home/usersettings. This will ensure a smooth process.

To summarize, Google Sheets is a powerful tool for computations, and being able to make API calls directly from it opens up even more possibilities for complex data analysis. You can leverage Google Sheets as a frontend for calculations and provide a user-friendly experience for business users, rather than relying on custom-built UIs. Feel free to reach out if you have any questions about making API calls from Google Sheets. And remember, happy coding!

That brings us to the end of another insightful episode of Continuous Improvement. I hope you've learned something valuable today and are inspired to explore the endless capabilities of Google Sheets. Stay tuned for more episodes where we'll continue to uncover strategies for personal and professional growth. I'm Victor, your host, signing off until next time. Keep improving and embrace the power of continuous growth!

從Google試算表發起API呼叫

想象一下,你是一位商業用戶,你最喜歡的工具是Excel。你可能不足夠技術化來編碼,但你很擅長寫函數、在試算表中計算和繪圖。在這篇文章中,我將向你展示如何在Google試算表中編寫簡單的指令碼,這樣你就可以從中發出一個簡單的API呼叫,並做更多強大的計算。使用起來非常容易,無需安裝。

首先,開啓一個新的空白Google試算表。然後我們會利用兩個單元格作為輸入坐標。我們可以稍後從Google試算表獲取這個單元格的值。在這個例子中,我們將B1和B2作為日期時間和日期的變數。

其次,我們創建一個按鈕。从上方的导航工具中,简单地点击“插入”然后选择“画图”选项。然后我们会画一个带有“获取空气温度”文字的矩形按钮。点击保存并关闭以创建新按钮。

在新创建的按钮上点击右键并选择“分配脚本”。我们现在先输入“getAirTemperature”,稍后我们再来创建这个方法。

第三步,在导航栏中,选择“扩展”然后选择“应用脚本”。我们将编写一些Javascript代码,类似于微软Excel的视觉基本宏脚本,所有的魔力都会在这里发生。

在代码编辑器里,复制并粘贴下面的代码:

function getAirTemperature() {
    // 使用Google試算表獲取輸入值
    let ui = SpreadsheetApp.getUi();
    let sheet = SpreadsheetApp.getActiveSheet();

    // Google試算表單元格 - [行, 列]
    let inputCoordinates = {
        datetime: [1, 2],
        date:
  created: [2, 2],
    }

    let outputCoordinates = {
        stations: [2, 4],
        readings: [2, 6]
    }

    let datetime = sheet.getRange(
        inputCoordinates.datetime[0],
        inputCoordinates.datetime[1]
    ).getValue();

    let date = sheet.getRange(
        inputCoordinates.date[0],
        inputCoordinates.date[1]
    ).getValue();

    let result = ui.alert(
        '請確認以下參數:',
        'datetime' + ":" + datetime + "\n" +
        'date' + ":" + date + "\n",
        ui.ButtonSet.YES_NO);

    if (result == ui.Button.YES) {

        // 對天氣API發送HTTP呼叫
        let apiCaller = ApiCaller()
        let response = apiCaller.getAirTemperature(datetime, date);
        Logger.log(response.getContentText());

        ui.alert('成功獲取氣象數據');

        let data = JSON.parse(response.getContentText());
        let stations = data["metadata"]["stations"];
        let readings = data["items"][0]["readings"];

        for (let i = 0; i < stations.length; i++) {
            // 將輸出值設置到Google試算表
            sheet.getRange(
                outputCoordinates.stations[0] + i,
                outputCoordinates.stations[1]
            ).setValue([stations[i]["name"]]);

            sheet.getRange(
                outputCoordinates.readings[0] + i,
                outputCoordinates.readings[1]
            ).setValue([readings[i]["value"]]);
        }


    } else {
        ui.alert('權限被拒絕。');
    }

}

ApiCaller = function () {

    var weatherApi = {
        "airTemperature": {
            "method": "GET",
            "endpoint": "https://api.data.gov.sg/v1/environment/air-temperature"
        }
    }

    return {

        getAirTemperature: function (datetime, date) {

            datetime = datetime.replace(/"/g, "")
            date = date.replace(/"/g, "")

            var method = weatherApi.airTemperature.method
            var url = weatherApi.airTemperature.endpoint + "?date_time=" + datetime + "&date=" + date

            var options = {
                "method": method,
                "contentType": "application/json",
                "headers": {
                    "Content-Type": "application/json"
                }
            };

            return UrlFetchApp.fetch(url, options)
        }
    }

}

如果你不理解这段代码在做什么,别慌,我来解释:当点击按键时,getAirTemperature方法会被触发。这个方法会从Google试算表中获取输入值,弹出一个等待用户确认的提示框。一旦用户确认,它就会使用UrlFetchApp.fetch发出一个API呼叫,获取新加坡的温度,然后它会遍历所有结果并显示输出。

第一次在按钮上点击,你会看到下面这条消息。

继续进行,登陆并选继续进行不安全的选项进行开发。

然后一個彈出式視窗會詢問是否確認輸入值:

點擊“是”繼續。如果一切順利,你應該可以看到成功確認的信息。

最后,我們從API調用中獲取溫度值,並將結果輸出到Google試算表。

就是这么简单。

如果你是一位开发人员而不是商业用户,你可能希望在你最喜欢的代码编辑器进行脚本更改,如VScode,并获取更好的源版本控制。你可以使用命令行界面clasp在你本地进行开发,而不是在线使用Apps Script编辑器。一旦你已经安装了Node.js,你可以使用以下的npm命令进行安装:

npm install @google/clasp

然后根据这个文档的说明操作:

https://developers.google.com/apps-script/guides/clasp

例如:

clasp login
clasp clone <你的脚本ID>

在你的VS code编辑器里进行更改,然后上传新的应用脚本。

clasp push

注意:你可能需要在访问https://script.google.com/home/usersettings后,再重新启用 Apps Script API。

总的来说,Google试算表是一个强大的用于计算的工具,从中直接发起API调用對於更复杂的使用场景而言更有用。你可以将它用作进行计算的前端,而对于商务用户来说,它比使用定制的UI更加友好。如果你有任何关于從Google試算表發出API調用的問題,請让我知道。编码愉快!

The Process of Self-Publishing a Book

A couple of months ago, I published a book online through Amazon's self-publishing service. Just to clarify, I am not a professional writer or artist; I work as a software engineering manager in the fintech industry. My motivation for writing the book was to improve my communication skills—a goal I identified during the COVID-19 lockdown last year when I had time for self-reflection.

I was inspired by a YouTube video from Dr. Jordan Peterson, a clinical psychologist and professor in Canada. He advised, "If you can think, speak, and write, you are absolutely deadly." This quote greatly motivated me, so I enrolled in his self-authoring program, which offers online prompts for self-reflection. Concurrently, I joined a Toastmasters club to improve my public speaking skills and met a mentor who encouraged me to write and publish a book.

Getting started wasn't the hard part; the challenge was maintaining the habit of writing, especially when I felt unmotivated. Distractions like notifications on my phone and negative self-talk ("I'm not a good writer; nobody will read what I've written") often deterred me. Despite knowing my book would likely not be a bestseller, I continued writing, staying true to my objectives.

What disappointed me was not receiving negative feedback but receiving no feedback at all. In today's internet age, traditional books face stiff competition from YouTube and podcasts. I still appreciate the printed word and read at least one book a week to stay mentally engaged and to stave off overthinking and depression.

The primary goal of my journaling was self-improvement, not public recognition. However, it was disheartening that even my close relationships, like my girlfriend, didn't take the time to read my work. While I did receive some positive feedback when I announced the book's publication on social media, only two people actually bought it—a sobering validation of my efforts.

The blunt truth is that if you're not a high-profile figure like the CEO of Disney, Jeff Bezos, or Elon Musk, your contributions are likely to go unnoticed. This realization is one of the lessons I've learned from self-publishing. Perhaps, if I were more renowned, I could sell a million copies. A book that goes unread feels like a new level of loneliness unlocked. Maybe I need to study marketing strategies or understand audience expectations before diving into another self-publishing project.

If you're interested in my journey and are looking for inspiration, my book is currently available on Amazon:

https://www.amazon.com/dp/B09FHXLD4G

The Process of Self-Publishing a Book

Hello, and welcome to Continuous Improvement, the podcast that explores personal growth, self-reflection, and the journey towards becoming the best version of ourselves. I'm your host, Victor, a software engineering manager in the fintech industry. Today, I want to share with you my experience of self-publishing a book and the valuable lessons I learned along the way.

A couple of months ago, I decided to take on the challenge of writing and publishing a book online through Amazon's self-publishing service. Let me clarify, I am not a professional writer or artist, but rather someone who was looking to improve my communication skills and embark on a journey of personal growth.

The motivation to write this book came to me during the COVID-19 lockdown last year. As I had time for self-reflection, I realized the importance of enhancing my abilities to think, speak, and write effectively. It was during this time that I stumbled upon a YouTube video by Dr. Jordan Peterson, a renowned clinical psychologist and professor from Canada. His advice that "if you can think, speak, and write, you are absolutely deadly," resonated deeply with me.

To further explore this path of self-improvement, I enrolled in Dr. Peterson's self-authoring program, which provided online prompts for self-reflection. Simultaneously, I joined a Toastmasters club to enhance my public speaking skills. It was during this time that I met a mentor who encouraged me to take the leap and write a book.

Getting started wasn't the most difficult part; it was maintaining the habit of writing despite feeling unmotivated. I faced distractions like constant notifications on my phone and negative self-talk that made me doubt my abilities. Thoughts like "I'm not a good writer" or "Nobody will read what I've written" often deterred me. But despite these difficulties and uncertainties, I remained true to my objectives and persevered with my writing journey.

However, what disappointed me the most wasn't negative feedback, but rather the lack of feedback altogether. In today's digital age, traditional books face fierce competition from platforms like YouTube and podcasts. While I still appreciate the printed word and read extensively to stay mentally engaged, it was discouraging that even my close relationships, such as my girlfriend, didn't take the time to read my work.

Though I did receive some positive feedback when I announced the publication of my book on social media, only two people actually bought it. This was a sobering validation of my efforts. It made me realize that without being a high-profile figure like the CEO of Disney, Jeff Bezos, or Elon Musk, it's incredibly challenging to gain recognition for one's contributions.

This realization became one of the invaluable lessons I learned from this self-publishing journey. It's clear that if I want to reach more people and create an impact, I should study marketing strategies and better understand audience expectations before diving into another self-publishing project.

If you're interested in learning more about my journey and are seeking inspiration in your own endeavors, I invite you to check out my book. You can find it on Amazon by searching for https://www.amazon.com/dp/B09FHXLD4G.

Thank you for joining me on this episode of Continuous Improvement. Remember, personal growth is a continuous journey, and sometimes the most valuable lessons are found in the setbacks and disappointments we face along the way. Stay motivated and keep striving to become the best version of yourself.

If you enjoyed this episode, don't forget to subscribe to our podcast for more inspiring stories and valuable insights. Until next time, this is Victor signing off.

Announcer: Thank you for listening to Continuous Improvement. For more episodes and information, visit our website at . Follow us on social media at @CIPodcast. If you have any questions or suggestions for future episodes, please email us at info@continuousimprovementpodcast.com.

出版自己書籍的過程

幾個月前,我透過亞馬遜的自我出版服務在網上出版了一本書。僅給予澄清,我不是一個專業的作家或藝術家;我在金融科技行業擔任軟件工程經理。寫這本書的動機是為了提高我的溝通技巧——我在去年COVID-19封鎖期間自我反思時確定的目標。

我受到加拿大臨床心理學家和教授喬丹·彼得森(Dr. Jordan Peterson)在YouTube視頻的啟發。他建議:“如果你能思考,說話,和寫作,你就絕對致命。”這句話極大地激勵了我,所以我報名參加了他的自我作者計劃,該計劃提供了自我反思的在線提示。同時,我加入了一個Toastmasters俱樂部以提高我公開演講的技巧,並遇到了一位鼓勵我寫作並出版書籍的導師。

開始並不是困難的部分;挑戰在於維持寫作的習慣,尤其是當我感到沒有動力時。像我手機上的通知和負面的自我對話(“我不是好作家;沒有人會閱讀我寫的”)讓我經常放棄。儘管知道我的書可能不會成為暢銷書,但我繼續寫作,忠於我的目標。

讓我失望的不是收到負面反饋,而是完全沒有收到反饋。在如今的互聯網時代,傳統書籍面臨來自YouTube和播客的激烈競爭。我仍然欣賞印刷文字,並至少每週閱讀一本書以保持思考並避免過度思考和抑鬱。

我寫日記的主要目標是自我提升,而不是公眾認知。但是,即使是我亲密的關係,比如我的女朋友,也沒有花時間閱讀我的作品,這讓我感到沮喪。當我在社交媒體上宣布書籍出版時,確實收到了一些積極的反饋,但實際上只有兩個人購買了它——這是我努力的清醒驗證。

直言不諱的事實是,如果你不是像迪士尼公司的CEO,傑夫·貝佐斯,或伊隆·馬斯克這樣的知名人物,你的貢獻可能會被忽視。這也是我從自我出版中學到的一課。也許,如果我更為知名,我可以賣出一百萬份。一本未被讀到的書感覺像是解鎖了新的孤獨層次。也許我需要學習市場營銷策略或在進行另一個自我出版計劃之前理解觀眾的期望。

如果你對我的旅程感興趣,並正在尋找靈感,我的書現在可以在亞馬遜上找到:

https://www.amazon.com/dp/B09FHXLD4G

The Lost Message

One night, a WhatsApp message lit up my screen, jolting me awake. Assuming it was an emergency, I was surprised to find that it was just a girl saying hi. "How's life, Victor?" Joanne, my former girlfriend from Hong Kong, had sent the message. "Did you get my message?" she asked. "Why didn't you respond?"

"I changed my phone number when I moved from Hong Kong to Singapore," I explained. As I spoke, thoughts of her flooded my mind, making me wonder about the message that had gotten lost.

We had attended different universities and pursued different degrees. Intrigued by science, I chose to major in chemistry. My goal was to unravel the mysteries of the universe. Unlike me, Joanne was pragmatic. She went into accountancy, aspiring to earn good grades, build a solid career, and secure a comfortable salary—while also finding a suitable and wealthy husband.

During one of our lunch dates, I suggested, "Let me take you to my favorite hawker center for $5 egg fried rice." Dissatisfied, she responded, "No, I want to go to a Japanese restaurant for delicious sushi, even if it's just a few pieces of rice." I tried to switch gears by talking about our vacation plans. "How about a local trip to Sentosa Island in Singapore?" I offered. "No, I want to go to Europe, to see the snowy mountains in Switzerland," she insisted.

Money was the stumbling block. "It's not just about the money," Joanne elaborated. "It's about your ambition to work hard, earn more, and elevate your social standing. That's what a responsible adult does." Despite working long hours, my expertise in quantum mechanics, Schrödinger equations, and black hole theories did not land me a high-paying job. "Victor, can you be more mature?" she asked.

Eventually, I changed jobs and got a pay raise. As my income rose, I felt the need to upgrade my lifestyle. When I told Joanne I was thinking about buying a car, she instantly exclaimed, "YES!" I purchased a blue Mini Cooper, and she seemed more excited about it than I was.

I began picking up Joanne in my new car every day. I was like her personal chauffeur, often extending free rides to her family and friends. Though maintaining the car was expensive, keeping my relationship with Joanne proved even costlier.

Joanne had a fondness for designer handbags. I had to gift her lavish items, even though I couldn't pronounce the names of her favorite brands correctly. Whether it was Gucci or Chanel, any of these handbags would cost me several months' salary. To settle my credit card debt, I had to cut back on the allowance I gave to my parents, which made me feel guilty.

During a romantic dinner at a Japanese restaurant, Joanne asked, "Victor, do you love me more than you love your car?" I tried to inject humor into the tense moment by replying, "Of course, I love my car," but she didn’t find it amusing. We continued to quarrel over trivial matters. "Victor, can you be more mature?" she asked yet again.

We were a couple of contrasting personalities. I was an introverted software developer who preferred talking to machines over people. Joanne, on the other hand, was an extroverted relationship manager in a bank, selling financial products with a soft yet assertive tone. What did that mean? It meant she earned more than I did.

After 18 months of dating, Joanne decided it was time to make a crucial choice: to continue with this "immature guy" or to look for alternatives. During one of our usual outings, I sensed something was off. She was distant and refused to hold my hand. Finally, after an uncomfortable silence, she spoke, "Victor, let's break up." My heart sank as I struggled to hold back tears. "Victor, can you be more mature?" she said one last time.

We remained friends after the breakup. Although I continued to send her gifts on her birthdays, she never reciprocated. Time does heal, and one day, an unexpected message from her arrived. It read, "Hey Victor, my wedding is coming up. Would you be interested in attending?" Irritated, I began to type "Congratulations," but I never pressed send. Instead, I deleted the message. "Why should I go?" I thought to myself.

I later saw pictures of her wedding on Facebook. She looked stunning, and her husband seemed wealthy and well-educated. "What a waste of money," I thought, but quickly pushed the idea aside. I had moved on. Relationships are built on trial and error, mostly error. If you don't want to repeat my mistakes, keep reading. I have plenty of advice on tackling life's challenges.

The Lost Message

Welcome to "Continuous Improvement," the podcast where we explore personal growth, life lessons, and finding ways to become the best versions of ourselves. I'm your host, Victor, and today we're diving into a story about relationships, personal sacrifices, and the pursuit of maturity.

Picture this: it all started with a simple WhatsApp message. I received a late-night greeting from someone I never expected to hear from again -- my ex-girlfriend, Joanne, from Hong Kong. Little did I know that this message would bring back memories and trigger a reflection on personal growth and continuous improvement.

Joanne and I had different aspirations and approaches to life. She focused on practicality, aiming for excellent grades, a successful career, and financial security. Meanwhile, my passion for science led me on a quest to unravel the mysteries of the universe.

Our differences often became apparent when it came to making choices on even the simplest things. For example, I suggested going to my favorite hawker center for an affordable and tasty meal, but Joanne longed for more luxurious experiences.

As time went on, I realized that money became a point of contention in our relationship. Joanne believed that ambition and financial success were markers of maturity and responsibility. And as my career advanced, so did the pressure to meet her expectations.

I finally got a pay raise and decided to reward myself with a new car, a shiny blue Mini Cooper. Ironically, Joanne seemed more thrilled about it than I did. I found myself playing the role of a personal chauffeur, giving free rides to not only Joanne but also her family and friends.

But the costs of maintaining the car and meeting Joanne's lavish desires began to weigh heavily on my finances. I had to cut back on my parents' allowance, which left me feeling guilty and conflicted.

Our differences in priorities and perspectives continued to create tension. We argued over trivial matters, with Joanne repeatedly questioning my level of maturity. Our personalities clashed, I was introverted and preferred the company of computers, while she thrived on social interactions and the prestige of her financial career.

After 18 months of dating, Joanne made a life-altering decision. She felt that she had to choose between staying with an "immature guy" or exploring other possibilities. It was a painful breakup, and I found myself questioning my own maturity once again.

Despite the breakup, we tried to remain friends. But as time went on, it became clear that the dynamic had changed. Joanne never reciprocated the gifts I sent on her birthdays, and I had to accept that some relationships are not meant to be salvaged.

Time passed and wounds healed, but sometimes life has a way of throwing unexpected curveballs. Joanne reached out again, inviting me to her wedding. I pondered attending, but ultimately chose to focus on my own growth and development. I had moved on and realized that dwelling on the past would only hinder my progress.

Relationships are like a continuous journey of trial and error. It's through these experiences that we learn about ourselves, our values, and what we truly desire in life. Looking back, I see that Joanne's perception of maturity was just one perspective among many.

If there's one lesson I can offer from my own story, it's this: continuous improvement starts by understanding ourselves and being true to our own values. We should never compromise our growth and happiness for someone else's expectations.

Thank you for joining me on this episode of "Continuous Improvement." Remember, life is a never-ending process of growth, and the pursuit of maturity is a personal journey we must all navigate. Until next time, keep striving for the best version of yourself.

失落的訊息

一個晚上,我的手機螢幕亮起了一條WhatsApp訊息,讓我驚醒。以為是緊急事態,我很意外發現只是一個女孩說嗨。"Victor, 你過得如何?"來自香港的前女友Joanne發來的訊息。"你收到我的訊息了嗎?"她問道,"為什麼你沒有回覆?"

"我在從香港搬到新加坡的時候換了手機號碼,"我解釋道。當我說著的時候,我心中湧現出對她的思念,想知道遺失的訊息是什麼。

我們就讀不同的大學,選擇不同的學位。我對科學有興趣,選擇化學作為主修。我的目標是揭開宇宙的神秘面紗。和我不同,Joanne 是實際的。她進入會計領域,希望取得好成績,建立穩固的職業生涯,並獲得豐厚的薪水——同時找到一個合適且富有的丈夫。

在我們的一次午餐約會中,我建議道,"讓我帶你去我最喜歡的小販中心吃5美元的蛋炒飯。"她不滿意,回答說,"不,我想去日本餐廳吃美味的壽司,即使只是幾顆米。"我嘗試改變話題,談論我們的度假計劃。"我們去新加坡的圣淘沙島旅遊如何?"我提議。"不,我想去歐洲,去看瑞士的雪山,"她堅持。

金錢是個絆腳石。"這不僅僅是關於金錢,"Joanne詳述道。"這關乎你的抱負,去努力工作,賺更多錢,提升你的社會地位。這就是一個負責任的成年人該做的。"即使我長時間工作,但量子力學、薛丁格方程式和黑洞理論的專業知識並沒有讓我得到高薪工作。"Victor,你能不能成熟點?"她問。

最終,我換了工作,並得到了加薪。隨著收入的增加,我覺得需要提升自己的生活水平。當我告訴Joanne我正在考慮買車的時候,她立刻驚喜地叫道,"好呀!"我買了一輛藍色的Mini Cooper,她對此比我更興奮。

我開始每天用我的新車接送Joanne。我就像她的私人司機,經常免費接送她的家人和朋友。雖然維護車輛的費用很高,但維護和Joanne的關係更是昂貴。

Joanne非常喜愛名牌手袋。即使我無法正確地說出她最愛的牌子的名字,我也必須送她奢侈的禮物。不管是Gucci還是Chanel,其中任何一個手袋都會花掉我好幾個月的薪水。為了償還我的信用卡欠款,我不得不削減我給父母的零花錢,這讓我感到內疚。

在一頓浪漫的日本餐廳晚餐中,Joanne問,"Victor,你是不是比愛你的車還愛我?"我試圖以幽默來緩解這個緊張的時刻,答道,"當然,我愛我的車,"但她並不覺得好笑。我們繼續為些小事吵架。"Victor,你能不能更成熟一點?"她又問了。

我們是一對性格迥異的情侶。我是一個宅男軟體開發者,我更喜歡與機器交談而不是人。另一方面,Joanne是一家銀行的外向型關係經理,以軟性但堅定的口吻銷售金融產品。那意味著什麼?這意味著她賺的錢比我多。

經過18個月的交往,Joanne決定是時候做一個重要的選擇:繼續與這個"不成熟的傢伙"交往還是尋找替代品。在我們的一次通常的外出中,我感覺到有些不對勁。她變得冷淡,拒絕握住我的手。最後,在一個難熬的沉默之後,她說道,"Victor,我們分手吧。"我的心像是被撕裂般疼痛,我努力地忍住不流淚。"Victor,能你不能更成熟一點?"她再次這麼說。

我們在分手後仍然是朋友。雖然我依然在她生日時送她禮物,但她從未回贈。時間總能愈合一切,有一天,她的一條出乎意料的訊息突然出現。內容是,"嘿 Victor,我要結婚了。你想來參加嗎?"我有些惱怒,開始打"恭喜",但我從未按下送出。反倒是刪除了這則訊息。"我為什麼要去呢?"我對自己這麼想。

我後來在Facebook上看到了她的婚禮照片。她看起來很漂亮,她的丈夫看起來很富有,受過良好的教育。"真是浪費錢,"我這麼想,但很快就把那個念頭拋到腦後。我已經走出來了。人際關係建立在試錯上,大多是錯誤。如果你不想重蹈覆轍,就繼續看下去。我有很多關於如何應對生活挑戰的建議。

Fortune

When I was a kid, my mom always told me, "Study hard! Otherwise, you could end up like that garbageman." The message was clear: I didn't want to collect trash for a living. Motivated by this fear, I worked hard in school and eventually went to university.

About a decade ago, I graduated with a bachelor's degree in chemistry. However, as Hong Kong is an international finance center, job opportunities for science graduates were scarce.

My first job had nothing to do with my degree. I worked at Uniqlo, a Japanese clothing store, as an entry-level sales associate with long hours. This job felt like a punishment. Like Sisyphus in Greek mythology, who endlessly pushes a rock up a hill only for it to roll back down, I would fold clothes neatly just for customers to come in and mess them up. This cycle led me to question the value of my education.

Eventually, I quit and went to Australia on a working holiday. I took up various jobs to survive, one of which was, ironically, a garbageman during a New Year's Eve event. The stench of alcohol and vomit was unbearable. It was a wake-up call: had I listened to my mom, maybe I wouldn't have found myself in such a role.

After a year in Australia, I returned to Hong Kong. Still unable to secure a job in my field, I transitioned careers by learning programming and becoming a software engineer. Yet, working at a reputable consulting firm, I was plagued by imposter syndrome. My solution was further education. I pursued a part-time master's degree in computer science and later, an MBA, hoping for a better career and to avoid ending up like the garbageman I once was.

During my MBA, I met Jonathan, a senior sales director at a software company. He helped me transition into a role as a technical sales consultant. This job required me to entertain clients, often through excessive drinking—something I had vowed never to do again.

One unforgettable night, during a business dinner with a major client, the volume of alcohol consumed pushed me to the edge. I excused myself to vomit in the restroom, a low moment that made me question my choices. I found myself recalling my days as a garbageman in Australia, the very position I'd tried so hard to avoid.

My new job also involved traveling across China and entertaining clients at KTV lounges, which often led to morally ambiguous situations. Despite my seemingly fortunate circumstances, I couldn't help but feel sympathy for the women working there. They didn't have the luxury to prioritize education and likely faced hardships I couldn't imagine.

Reflecting on my journey, I realize my mom was right—education is invaluable. Yet, here I was, entertaining clients with drinks just like the women at KTV. Their struggle and mine were not so different. So, before passing judgment on others, remember: every job is the result of a story you may not know. Treat everyone with the respect they deserve, regardless of their job title. Thank you.

Fortune

Hello and welcome to Continuous Improvement, the podcast dedicated to personal growth and professional development. I'm your host, Victor, and today we have an inspiring story of resilience, career transitions, and the importance of not judging others based on their job titles.

When we are young, we often receive advice from our parents about the importance of education and the fear of ending up in certain professions. But sometimes life has different plans for us. Today, I want to share with you an incredible journey of self-discovery and continuous improvement, based on a blog post titled "Every Job Has a Story" by an anonymous author.

Our story begins with the author's mom warning them to study hard or else they might end up as a garbageman. Fueled by this fear, the author worked hard and obtained a chemistry degree. However, job opportunities in their field were limited, forcing them to take a job at a clothing store.

Folding clothes in the store felt like a punishment, similar to Sisyphus endlessly pushing a rock up a hill. The author began questioning the value of their education and their chosen career path. Their journey took an unexpected turn when they worked as a garbageman during a New Year's Eve event in Australia.

The experience of being a garbageman, surrounded by the stench of alcohol and vomit, became a wake-up call for the author. It made them realize the importance of listening to their mom's advice and avoiding ending up in a job they had initially looked down upon.

Returning to Hong Kong, the author struggled to find employment in their field. Determined to change careers, they taught themselves programming and became a software engineer. Yet, imposter syndrome plagued their confidence. To overcome this, the author pursued further education—a part-time master's degree in computer science and later, an MBA.

But even after transitioning into a technical sales consultant role, the author found themselves repeating past mistakes. This job involved entertaining clients through excessive drinking, similar to the days when they were a garbageman.

A low point came during a business dinner with a major client when the author excused themselves to vomit in the restroom. This humbling experience reminded them of their earlier struggles in Australia and the job they had desperately tried to avoid.

The author's professional life also included encounters with KTV lounge culture, where they saw the challenges faced by women working in such environments. They realized that the struggle of these women and their own struggles were not so different.

Reflecting on their journey, the author gained a profound understanding of the value of education and the importance of never judging others based on their job titles. They share this message with us: every job has a story, and it's crucial to treat everyone with the respect they deserve.

And that concludes our story today. Remember, continuous improvement isn't just about personal growth; it's also about understanding and respecting the journeys of others. Thank you for joining me on this episode of Continuous Improvement. I'm Victor, your host, and I look forward to sharing more inspiring stories with you in the future.