こういうシートがあって
以下のような一次元配列にしたい
[2019/12/13, 2019/12/14, 2019/12/15, 2019/12/16, 2019/12/17, 2019/12/18, 2019/12/19, 2019/12/20, 2019/12/21, 2019/12/22, 2019/12/23, 2019/12/24]
コード.gs
function myFunction() { var sheet = SpreadsheetApp.getActiveSheet(); var lastRow = sheet.getLastRow(); var resultArray = []; var range = sheet.getRange(2, 1, lastRow, 1); var values = range.getDisplayValues(); values = arrayPushApply(values); Logger.log(values); } //二次元配列を一次元配列にして返す function arrayPushApply(array){ for(var i = 1; i < array.length; i++){ Array.prototype.push.apply(array[0], array[i]); } return array[0] } |
A列の値を5行ずつ実行してみる
コード.gsfunction myFunction() { var sheet = SpreadsheetApp.getActiveSheet(); var lastRow = sheet.getLastRow(); var resultArray = []; var startRow = 2; var numRow = 5; var iterate = Math.round(lastRow / numRow) + 1; Logger.log(iterate) for(var i = 0; i < iterate; i++) { var range = sheet.getRange(startRow, 1, numRow, 1); var values = range.getDisplayValues(); values = arrayPushApply(values); values = values.filter(function(value) { return value !== ''; }); if(values.length > 0) { resultArray.push(values) startRow = startRow + numRow; } } resultArray = arrayPushApply(resultArray); Logger.log(resultArray); } //二次元配列を一次元配列にして返す function arrayPushApply(array){ for(var i = 1; i < array.length; i++){ Array.prototype.push.apply(array[0], array[i]); } return array[0] } |
A列の値を5行ずつを2回実行して
次回実行時は12行目から実行したい
スクリプトのプロパティにstartRowというプロパティを作って初期値2をセットしておく
実行する度にstartRowにnumRowsの値が足されて
最終行よりも大きくなると初期値の2に戻す
処理が重くて一度で終わらない場合(6分またはG suiteの場合30分が実行の上限)
複数回に分けて実行できるようにしたいので、
スクリプトのプロパティを利用して以下のようなコードで実現しました。
コード.gsfunction myFunction() { var sheet = SpreadsheetApp.getActiveSheet(); var lastRow = sheet.getLastRow(); var resultArray = []; var numRow = 5; var iterate = 2; for(var i = 0; i < iterate; i++) { var startRow = getProp('startRow'); var range = sheet.getRange(startRow, 1, numRow, 1); var values = range.getDisplayValues(); values = arrayPushApply(values); values = values.filter(function(value) { return value !== ''; }); if(values.length > 0) { resultArray.push(values) setProp('startRow', parseInt(startRow) + numRow); } else { setProp('startRow', 2); } } resultArray = arrayPushApply(resultArray); Logger.log(resultArray); } //二次元配列を一次元配列にして返す function arrayPushApply(array){ for(var i = 1; i < array.length; i++){ Array.prototype.push.apply(array[0], array[i]); } return array[0] } function getProp(key) { return PropertiesService.getScriptProperties().getProperty(key); } function setProp(key, value) { PropertiesService.getScriptProperties().setProperty(key, value); } |