Google Apps 有多強大,這就不用我在此贅述,Google 一下大概就知道了。
其實要說 Google Apps 可以完全取代 微軟 的 Office,還言之過早。畢竟到目前為止,除了 Kingsoft Office Suit 相容性比較高之外,其他版本的 Office 可以說用「慘」一個字來形容。更何況是雲端的 Office。不過,話說回來,雲端 Office 本來就不是要來取代桌面 Office 的,他只是提供一種便利的服務,讓你隨時隨地可以取用文件,並進行分享與協同運作。
但未來,當這樣的形態成了大家共同的作業模式,你就不能輕忽他會帶來的影響性了。
OK,進入正題,我為什麼要寫 Google Apps Script?
主要是我想了解 Google Apps 的整合運用,當我們在雲端建構好呈現的介面,透過 JSON 資料傳輸技術,我們就可以很容易的將企業內的資料(或者雲端上的資料)呈現到外部環境(當然,假設安全條件無虞的情況下),而不需要花大錢去建構一整套系統來達成這個運用,更不用說還要考慮後續 Maintain 的所有事情(理想狀況)。
怎麼開始呢?
連到這個網址 https://developers.google.com/apps-script/ 按一下 Get Started 這個按鈕。
所有說明文件與範例都在上面,照著步驟一個一個做,其實不難。
問題是要做什麼運用?
Office 最強的地方在哪裡?其實不在編輯文字或做出很漂亮的簡報、文件,而是企業內部強大的應用,Excel + VBA。
Google Apps 中加入了 Google Apps Script,那就等於整個 Google Apps 平台,都可以讓你使用,用多少付多少,這就是重點了。
所以我的想法很簡單,我怎麼樣在 Googls Sheets 中重現我在 Excel 中所做的事,請往下看。
我之前幫老婆寫了一支排座位的程式,可以用來排班級座位,每次段考/小考,就可以要學生依座位表的內容就座,就是要防止作弊啦!
按一下講桌,就可以重新產生一張座位表,很方便。
所以,起手式,就用這一支來實作看看吧!
首先進入 Google Drive,建立一張試算表,將格子拉一拉.....還真難拉 T_T
而且還沒有框線!(還是我找不到?)所以就用顏色標示區隔。其實用熟了,拉表格也還蠻快的,但就是有點彆扭。(Google加油蛤!)
接下來,在工具下拉,選指令碼編輯器
第一次產生,他會要你選擇要產生哪一類型的 Script,選試算表那一個。
接著就會產生一個 程式碼.gs 的頁面以及範例程式。
接下來,就開始寫程式吧!(不用想太多,就跟寫 Macro 一樣)
- function setSeat(){
- var iCol;
- var iRow;
- var sheetApp = SpreadsheetApp.getActiveSpreadsheet();
- Logger.log('讀取座位表');
- var sheet1=sheetApp.getSheetByName('座位表');
- Logger.log('參數設定');
- var sheet2=sheetApp.getSheetByName('參數設定');
- iCol = sheet2.getRange(1,2).getValue();
- iRow = sheet2.getRange(2,2).getValue();
- var a=[];
- var i, j, k;
- var seed;
- var iFix, iCount, iStart
- var i1
- iFix = sheet2.getRange(3,2).getValue();
- iStart = 0;
- var startrow = 8;
- var startcol = 2;
- //Randomize ' 對亂數產生器做初始化的動作。
- for (iCount = 1;iCount<=iFix + 1;iCount++){
- i1 = sheet2.getRange(3 + iCount,2).getValue();
- for (i=iStart+1;i<=i1;i++){
- a[i] = getSeed(a,i1);
- } //i
- iStart = i - 1;
- } //iCount
- k = 1;
- for (i = 1;i<=iRow;i++){
- for (j = iCol;j>=1;j--){
- sheet1.getRange(startrow + (i - 1) * 2, startcol + (j - 1) * 2).setValue(a[k]);
- k++;
- } //j
- } //i
- }
- function getSeed(a,i){
- var seed = Math.floor(Math.random()*i)+1; // 產生 1 到 36 之間的亂數值。
- for (var j = 1;j<=i;j++){
- if (seed == a[j]){
- seed = getSeed(a,i);
- }
- }
- return seed;
- }
我把主要要產生座位編排的程式,寫在 setSeat() 這個 function 中,SpreadsheetApp 是內建的物件,透過它可以取得試算表的控制權。
我將一些參數寫在 參數設定 這個 Sheet 中,如果要改變規則(例如:人數增減,座位增加等),就讓老婆自己修改,改一下座位表的版面即可。(要知道,當程式寫得不夠彈性時,會有奪命連環Call)
程式很簡單,就是藉由亂數產生不重複的編號,丟進去 Array 中,再 Dump 到工作表的相關位置上。程式碼從 VBA 移植過來,沒有花太多時間,主要是在 Excel Object Model Mapping 到 Google Sheets Object Model 的熟悉程度,還好 Google Apps Script 的編輯器,已經有 Code Insight 的功能,要了解並不困難。
OK,程式寫完了.....啊...怎麼執行啊?
Google Apps Script 的 IDE 有執行 & Debug 的功能
選取後,執行就可以馬上知道結果
瞧,跟 Excel 執行的結果沒兩樣呢!那麼就把 講桌 的 Button 加上去吧....噫?竟然沒有!
這麼不 Friendly,User 怎麼知道要去選工具,選指令碼管理員,選要執行的程式,這樣使用經驗會很糟糕吧!
研究了一下,看來只能用圖形的方式來做了,用插入 | 繪圖 的方式,自己做一個 Button 的圖形擺上去,其實這裡很方便的就提供您指定指令碼的功能
把它指派好 setSeat 這樣這個圖形就有執行程式的功能了
此程式已設定為共用,請參考以下連結
https://docs.google.com/spreadsheet/ccc?key=0AiEO0LGS-8xNdGpMVnVDejNMdWJJbzFzbEgxc3Fta2c
附記1:原本以為在 iPad 上也可以使用,結果 Script 無法在 iOS 上執行,可惜
附記2:要能夠執行 Script,還不是那麼簡單勒...要一大堆設定...還在 Try 當中,不過可以看到協同運作的功能了,一個開啟的使用者改變了 Sheets 內容,其他開啟的使用者的內容也會跟著更新
3 意見
親愛的作者,您好:
Reply不知可否簡單的教導一下,我想要寫一支程式,每1個小時檢查公司各個網站是否正常運作的程式,各個網址放在sheet(第一欄為網址,第二欄為各網站管理員的email)中,給程式一一讀取檢查個網站是否可正常連線,當無法正常連線時,可以自第二欄取得email address,自動發送給管理人員,不知應如何著手,謝謝~~
你好:
Reply請問目前有辦法可以在蘋果系列的裝置上執行嗎?
因為目前也遇到這問題QQ
感謝您!
感謝你的範例。
Reply張貼留言