[Google Apps]--My First Google Apps Script

最近看到 Google Apps 推出 Google Apps Script 可以用來整合 Google Drive 資源,腦海中頓時有了出現救世主了的想法。

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 一樣)


  1. function setSeat(){  
  2.   var iCol;  
  3.   var iRow;  
  4.   var sheetApp = SpreadsheetApp.getActiveSpreadsheet();  
  5.   Logger.log('讀取座位表');  
  6.   var sheet1=sheetApp.getSheetByName('座位表');  
  7.   Logger.log('參數設定');  
  8.   var sheet2=sheetApp.getSheetByName('參數設定');  
  9.     
  10.   iCol = sheet2.getRange(1,2).getValue();  
  11.   iRow = sheet2.getRange(2,2).getValue();  
  12.       
  13.   var a=[];  
  14.   var i, j, k;  
  15.   var seed;  
  16.   var iFix, iCount, iStart  
  17.   var i1  
  18.       
  19.   iFix = sheet2.getRange(3,2).getValue();  
  20.   iStart = 0;  
  21.     
  22.   var startrow = 8;  
  23.   var startcol = 2;  
  24.   
  25.     
  26.   //Randomize    ' 對亂數產生器做初始化的動作。  
  27.   
  28.   for (iCount = 1;iCount<=iFix + 1;iCount++){  
  29.     i1 = sheet2.getRange(3 + iCount,2).getValue();  
  30.     for (i=iStart+1;i<=i1;i++){             
  31.       a[i] = getSeed(a,i1);  
  32.     } //i  
  33.     iStart = i - 1;  
  34.   } //iCount  
  35.     
  36.   k = 1;  
  37.   for (i = 1;i<=iRow;i++){  
  38.     for (j = iCol;j>=1;j--){  
  39.       sheet1.getRange(startrow + (i - 1) * 2, startcol + (j - 1) * 2).setValue(a[k]);  
  40.       k++;  
  41.     } //j  
  42.   } //i  
  43. }  
  44.   
  45. function getSeed(a,i){  
  46.   var seed = Math.floor(Math.random()*i)+1;    // 產生 1 到 36 之間的亂數值。  
  47.   for (var j = 1;j<=i;j++){  
  48.     if (seed == a[j]){  
  49.       seed = getSeed(a,i);  
  50.     }  
  51.   }  
  52.   return seed;  
  53. }  


我把主要要產生座位編排的程式,寫在 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 意見

張貼留言