2024年10月10日 星期四

試算表 : 將多欄資料合併為一欄

2024年10月10日 星期四

給自己出了一個每天要做旳功課,聽 ICRT 「News for Kids」、「News Bites」跟 VOA Learning English,並且利用 「ICRT Episodes Timestamp」及「VOA Learning English Timestamp」兩個Chrome 擴充功能幫網站的文本加上時間戳記,最後再匯出為 SRT 字幕檔,匯整到「雄:以 ICRT & VOA Learning English 提升英文能力」中。

原本所有的 SRT 字幕檔案是儲存到 Google Drive 中,再以我研究的一個程序讓 Blogger 中的程式可以擷取到字幕的內容,不過,這個方式有一個小缺點,因為必須透過別人的網站來突破 CORS 的限制,速度不穩定,有時甚至就卡住而擷取不到字幕檔。哈!程式如果這麼不穩定,實在有一點丟自己的臉;沒關係,山人自有妙計!

查了一下,Google 試算表的儲存格,一格最多可以儲存 50,000 個字元,而我的字幕檔內容,基本上不會超過這個大小;於是寫了一個程式,將原來已製作好的字幕檔,通通塞到試算表中的儲存格中,一則一格 (圖1),這個方式在沒有調整列高之前,很可怕!想跳到最後一列要找半天。

[圖1] 儲存在試算表中的字幕內容

為什麼要將字幕檔的內容改以試算表來儲存呢?

主要是去年開發 HTML5 FUN 烘焙機的自製遊戲啟動器及今年六月的「HTML5 FUN:PARTDLE 兜一兜」中,都是使用 Google 試算表來當作資料庫,而且已經有一個算成熟的程序;最大的好處是完全不用再透過別人的網站來擷取資料,只要 Google 試算表沒問題,使用 JSONP 來直接讀取資料的速度相當理想 (如果使用 Google Apps Script 也是會稍等一下才能接收到資料)。

另外,原來字幕選單的更新,是修改 Blogger 的 HTML 語法,還得將資料剪剪貼貼的,現在通通在一個試算表中完成,管理上較簡便。

看一下試算表儲存選單的工作表內容:

選單工作表中用了四個欄位,除了第一列記錄了 NewsForKids、NewsBites、EzNews、VOA 四個標題(其實是另外四個工作表的名稱),其它儲存格中都是放公式 (圖2)。

[圖2] menu工作表中的內容

每一欄代表一種字幕的選單:

  • A 欄放的是 ICRT News for Kids (使用工作表 NewsForKids)。
  • B 欄放的是 ICRT News Bites (使用工作表 NewsBites)。
  • C 欄放的是 ICRT EZ News (使用工作表 EzNews)。
  • D 欄放的是 VOA Learning English (使用工作表 VOA)。

選單的資料是將相關工作表中的 A 欄(ID)、 B 欄(日期) 及 C 欄(標題),三欄合為一欄,自動產生的。來看看使用了什麼試看表內建的公式,以 [圖2] 的那一筆為例:

=byrow(INDIRECT("NewsForKids!A2:C"), lambda(row, textjoin(char(9), true, row)))

  • byrow : 一列列抓取第一個參數指定範圍的資料,並傳給第二個參數的函數去處理。
  • INDIRECT("NewsForKids!A2:C") : 以文字的方式來指定資料的範圍。為什麼不直接使用「NewsForKids!A2:C」,而要用「INDIRECT」?主要是實作時,發現如果在字幕資料的工作表最前面插入一列後,「NewsForKids!A2:C」會因為多了一列而被更動,這樣子會天下大亂,所以只好改用 INDIRECT("NewsForKids!A2:C") 來設定範圍。
  • lambda : 將接收到的資料以第一個參數來命名,並讓第二個參數的自訂函數來使用。
  • textjoin(char(9), true, row)) : 將收到的資料合成一個字串。第一個參數為不同資料間的連接符號(本例使用「char(9)」,也就是跳格符號 TAB);第二個參數為 true,所以會跳過沒有內容的部份;第三個參數為傳來的資料(本例就是 NewsForKids 工作表中的內容)。
在選單工作表 (menu 工作表) 的第二列中都是放類似前面的公式,公式展開後,就能得到像 [圖2] 的內容了;這樣子每次新增字幕資料後,它都能自動產生選單所需要的資料,滿方便的。

那在「雄:以 ICRT & VOA Learning English 提升英文能力」中,要怎麼製作選單?

[圖3] 在 Blogger 中的選單畫面

以前面 NewsForKids 的 A2 儲存格的內容為例:

8ca0381f 2024-10-10 Happy Double Ten Day

這個例子中雖然看起來是一個字串,仔細觀察一下,「8ca0381f」、「2024-10-10」與「Happy Double Ten Day」是不是看起來好像有空格,其實它跳格符號(TAB),而不是一般的空格。有了這個 TAB 符號,就可以將一個字串再分解為三個製作選單時,所需要的欄位了。

第二、三欄位是選單中會出現的文字,第一個欄位則是用來到試算表中找字幕資料的識別碼。可以試算表中有好幾個工作表,怎麼知道本例中的「8ca0381f」是在哪一個工作?前面提過,在 menu 工作表中的 A1 那格裡,放的其實就是工作表的名稱,所以在 A 欄中的所有識別碼,都應該要去 A1 中指定的工作表去搜尋。哈!這樣是不是很完美(自己說的)。

以上純粹是記錄給日後失憶的自己參考用,東西玩太多了,似乎會愈來愈將玩過的遺失在腦袋的某個小角落,然後找不著,記錄下來還是比較保險。

相關連結


沒有留言:

張貼留言

 
雄::gsyan © 2009. Design by Pocket