Apps Script公式リファレンス: Apps Script Reference |障害・課題追跡: IssueTracker |Google Workspace: Status Dashboard - Summary

2019年12月13日金曜日

A列の値を一次元配列で取得したい(指定した行数分ずつ実行したい)


こういうシートがあって

以下のような一次元配列にしたい

[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行ずつ実行してみる

コード.gs
function 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分が実行の上限)
複数回に分けて実行できるようにしたいので、
スクリプトのプロパティを利用して以下のようなコードで実現しました。


コード.gs
function 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);
}



Latest post

Google Apps Scriptの障害時はIssueTrackerを見てみる - Incidents for Apps Script are reported on Issue Tracker

IssueTracker > Apps Script issues https://issuetracker.google.com/savedsearches/566234 Google Apps Scriptの障害時は IssueTracker に課題が上がっていることが...