iInfo 資訊交流: Google Apps Script 入門到進階(14) --- Spreadsheet 不會自動增加 Row 的影響

最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2017/02/20] 近來有網友詢問 MultiCharts 與 Excel 畫冰火能量圖 (8)MultiCharts 與Excel 畫冰火能量圖(11) --- 更名「台股儀表板」 文章中教學檔案取得方式,有興趣的朋友可透過 Line了解詳情 (請勿以為是免費分享),Line : aminwhite5168。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲,請盡快把握機會,歡迎券商、大專院校邀約講座。

[公告2018/06/01] 台指能量儀表板教學課程,課程如網頁內容 台北班:台指能量儀表板

[公告2018/10/02] 期交所於2018/10/03進行網址改版,若有參考部落格與期交所相關文章,請各位讀者自行修改。

2018年1月28日 星期日

Google Apps Script 入門到進階(14) --- Spreadsheet 不會自動增加 Row 的影響

當 Google Spreadsheet 在資料填到最後一行,Google Spreadsheet 無法自動新增行,導致計算發生異常。
原因:Google Spreadsheet 在行數不足時,無法自動判斷新增行數來應付,自動增加行數需要自行添加程式處理。
舉例;對儲存格A1到A5有5個數字,使用Script 進行累加計算。

使用以下程式碼發生的錯誤。
function testSheetLastRow()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var Row = ss.getRange("A:A").getValues();
 
  var row = 0;
  var sum = 0;
  while (1) 
  {
    sum = sum + Row[row][0];
    Logger.log("row = " + parseInt(row, 10)  + " Row[" + parseInt(row+1, 10) + "][0] = " + Row[row]); 
    row++;
    Logger.log("row = " + parseInt(row, 10)  + " Row[" + parseInt(row+1, 10) + "][0] = " + Row[row]+ " sum = " + sum);
    Logger.log("-----------------------------");
  }
}

由執行 Log 看出,當要索取第 6 行的儲存格,由於儲存格數只有 5 行,無法取得第 6 行的儲存格,導致出現錯誤。

解決方式:使用 getMaxRows() 取得儲存格的最大行數來限制執行。
function testSheetLastRow()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var Row = ss.getRange("A:A").getValues();
 
  var row = 0;
  var sum = 0;
  while (row < ss.getActiveSheet().getMaxRows()) 
  {
    sum = sum + Row[row][0];
    Logger.log("row = " + parseInt(row, 10)  + " Row[" + parseInt(row+1, 10) + "][0] = " + Row[row]); 
    row++;
    Logger.log("row = " + parseInt(row, 10)  + " Row[" + parseInt(row+1, 10) + "][0] = " + Row[row]+ " sum = " + sum);
    Logger.log("-----------------------------");
  }
}
如果 Spreadsheet 存在重要資料,又遇到行數不足問題,使用 getMaxRows()搭配getLastRow() 判斷資料行數是否不足,再以 insertRowAfter() 新增行數來解決。
var ss = SpreadsheetApp.getActiveSpreadsheet();
if ((ss.getActiveSheet().getMaxRows() - ss.getLastRow()) < 2)
    ss.insertRowAfter(ss.getActiveSheet().getMaxRows());
參考資料: