最近隔壁同事開始使用 chatGPT 修改我以前幫他寫的 code,效果相當驚人,居然解決了我們長久以來無法打破的障礙,因為我也不是專業的工程師,從統計出來都只用 R 寫一些小玩具,牽涉到太複雜的部份像是 HTML 語法,有時候就沒辦法立刻解決,也沒辦法花太多時間研究,有時候就讓乳牛 code 繼續畸形的跑下去,沒辦法解決的困難也只能先放著,工作流程就變成半自動半手動。

還記得 chatGPT 剛出來的時候,我就有想要用來修改程式,尤其是當時學習 google app script,結果差強人意,不僅常常寫出文不對題的函式,程式碼直接跑下去還一直報錯,回饋給 GPT 也沒辦法快速解決,反而不如自己寫的快,不過去年我就有發現 chatGPT 對於報錯都可以有正確的回答,也一直有在使用。而看到我同事的例子,才發現現在更強大了,持續對話就可以生成程式碼,而且我覺得寫得比我之前的版本更好(要被淘汰了)。
- 我要做一個轉寄信件的R程式範例,需要將專案依照負責人寄給對應的信箱 請幫我生成兩個表格內容,此外還要生成一封信件範例,裡面有需要依照人物填入負責人和部門的內容
專案 類別 負責人
負責人 信箱 - 然後 GPT 就幫我生成了兩個表格,我依照我的習慣貼到 googlesheet,然後他就自己做了可以套入不同專案資訊的信件,並詢問我寄信的細節,包含是使用用 Gmail、Outlook 還是其他 SMTP?信件內容是否為純文字即可,還是要 HTML?我的回答是我要使用 gmailr 函數
- 然後他就幫忙整合好了(還有提醒要開啟Gmail API),我只要微調裡面的內容就可以馬上使用!
首先,設定好 gmailr 的憑證,如何設定在先前的文章有提到。
R 套件筆記 | 利用 gmailr 套件與設定 gmail 帳號,實現自動化制式郵件
rm(list=ls())
library(gmailr)
#path放上下載好的憑證檔案
gm_auth_configure(path = "YOURPATH/credentials.json")
gm_auth(email = TRUE ,cache = ".secret")
#The gmailr package is using a cached token for YOURMAIL@gmail.com.
新學到了 glue 函數,之前 UTF8 的字串處理真的是搞死我,信件標題還有點蠢的寫了一長串轉換,而且使用 glue 的話內文也不需要另外排版,可以自動處理縮排和換行(不用一直<br>了),變數直接放在大括號內,如果牽涉算式也可以直接運算,實在太美妙了。
另外我也不習慣使用 purrr,一直以來都是用迴圈硬幹,簡潔的程式碼令人愉悅,看來之後要多跟 chatGPT 討教討教。
library(googlesheets4)
library(dplyr)
library(glue)
library(gmailr)
library(purrr)
# ===== 專案 & 負責人資料 =====
gsheet <- "https://docs.google.com/spreadsheets/d/1BklsguRoTa_wvkQzzxMEeNlHioJDCEOoPiBXcbB5BHI/edit?gid=921198502#gid=921198502"
responsible_info <- read_sheet(gsheet ,sheet="信箱列表")
project_info <- read_sheet(gsheet ,sheet="專案資訊")
# ===== 合併資料 =====
mail_data <- project_info %>%
left_join(responsible_info, by = "負責人")
# ===== 產生並寄出信件的函數 =====
send_project_email <- function(專案, 負責人, 部門, 信箱) {
# 信件主旨與內文
subject <- glue("請協助確認「{專案}」專案最新進度")
body <- glue("
親愛的 {負責人} 您好,
感謝您在「{專案}」專案上的投入與協助。
我們目前正在彙整本階段的進度報告,懇請您協助提供以下資訊:
- 當前進度是否有變更?
- 是否有資源或支援上的需求?
- 有無預計的風險或延遲事項需提前說明?
這項專案由 {部門} 部門負責,您的回覆將有助於我們準確掌握整體進展,並確保後續安排順利進行。
如您對此有任何問題,歡迎隨時聯繫專案管理室。
再次感謝您的協助!
敬祝
工作愉快、萬事順心
專案管理室 敬上
(系統自動發送,請勿直接回覆)
")
# 建立信件物件
email <- gm_mime() %>%
gm_to(信箱) %>%
gm_from("YOURMAIL@gmail.com") %>%
gm_subject(subject) %>%
gm_text_body(body)
# 寄出信件或是產出草稿
#gm_send_message(email)
gm_create_draft(email)
}
#pmap系列函數參數數量要相同,如果不篩選的話,多一個 類別 會報錯
pwalk(mail_data[, c("專案", "負責人", "部門", "信箱")], function(專案, 負責人, 部門, 信箱) {
send_project_email(專案, 負責人, 部門, 信箱)
})