2014年10月13日 星期一

Triggers

如果有其他的需求,譬如希望我們開啟檔案時自動做一些事,編輯檔案時自動做一些事?

Google Apps Script支援一些trigger :

onOpen():
開啟檔案時會被喚起,是"任何檔案"喔。如果要知道目前被開起來的檔案資訊,只能call:
var sheet = SpreadsheetApp.getActiveSpreadsheet();
就是取得現在出現在螢幕上的這個sheet.
對重新整理也會有反應。

例如:
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  sheet.appendRow(['Cotton Sweatshirt XL', 'onOpen']);
}
會在開啟的檔案後面加一行文字

onEdit(),onEdit(e):
在檔案被編輯時被喚起。
加上參數e的話,目前被編輯的檔案資訊會被放在e裡面。
例如:

function onEdit(e) {
  
  var sheet = e.source;
  var sname1 = sheet.getName();
  var sname2 = sheet.getSheetName();
  var surl = sheet.getUrl();
 // Logger.log('changed: '+surl+' : ' + sname1 + ' : ' + sname2 + ' : ' + new Date() );
  sheet.appendRow(['changed: '+surl+' : ' + sname1 + ' : ' + sname2 + ' : ' + new Date()] );
  
}

一樣會在被編輯的檔案後面加文字

設定Trigger有兩種方式,一種是直接對function取被保留的名稱:onOpen(), onEdit()等等,則會自行啟動。或者可以在Resource->Current project;s triggers/All triggers裡設定。
功能上沒有明顯差異,但測試後,我感覺到用前者的方式程式執行比較快速。
一次設定多個trigger也是可能的,譬如我多設定了一個onEdit2(e),設成onEdit條件的trigger,則onEdit(e)和onEdit2(e)會一起執行。先後次序如何我就沒有測試了。

檔案讀寫操作

因為受親友所託,略略研究了一下Google Apps Script。不記錄下來好像有點可惜。
假設今天在Google drive上放了一些表單,spreadsheet之類的,想對它們進行自動操作該怎麼辦呢?

第一個範例:

function CopyNewSheet() {
  var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1fYgyKkOAWKOQo79UHejnNfh-YUYdyhV8ZmgbDcGwUGY/');

  //get Sheet and add something
  var nsize =  ss.getNumSheets();
  ss.insertSheet('newsheet2', nsize);
  var ps = ss.getSheets()[0];
  var ns = ss.getSheets()[nsize];
 
  var data = ps.getDataRange();
  var data2 = ns.getDataRange();
  data.copyTo(data2);
   
}

openByUrl這一步可以得到該表單,但是這只會指向表單的第一頁。如果想要取得後面的就要呼叫getSheets()[idx]; index自然是從0開始了。

取得data則必須用getDataRange(); 會取到sheet裡全部的範圍,就像我們在excel裡選取的範圍。
注意這取到的是指標,所以我們可以把一個range貼到另一個,上述code的結果就是把ps這個sheet完完全全複製到ns,就連公式也一樣。

但如果不想複製公式,只要取值,就要改成:

  var data = ps.getDataRange().getValues();
 
  for (var i = 0; i < data.length; i++) {
    ns.appendRow(data[i]);
  }