從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],
        pubDate: [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調用的問題,請让我知道。编码愉快!