LoginSignup
6
6

More than 1 year has passed since last update.

スプレッドシート ピボットテーブルの範囲をGoogleAppsScript(GAS)で更新する

Last updated at Posted at 2022-02-07

スプレッドシート上で作成したピボットテーブル。
便利なのですが、困ったことが。
ピボットテーブルのデータ範囲が自動で更新されない。

エクセルで作成したピボットテーブルなら、あたりまえのようにデータ範囲は自動で更新されるのに
※ソースの指定をソース'!A:Gにしたら自動で更新されます。コメント欄で共有していただきました。(2022/12/24)
過去の自分に教えてあげたい。!!

毎日ピボットテーブルのデータ範囲を手動で更新するのは嫌だと苦情がきたので、
GoogleAppsScript(GAS)で自動更新します。
※Query関数でも似たようなことができるとコメント欄で共有していただきました。(2022/6/24)

##環境・前提
・スプレッドシートでピボットテーブルを作成している
・GoogleSheetsAPIが有効になっている
・ただし、リアルタイムに自動更新されないので、GASにタイマーを設定する(時間指定のトリガー)
・シート名で管理しているの

具体的には以下の箇所をGoogleAppsScriptで更新します。

image.png

グーグルで検索してでてくるサンプルは
ピボットテーブルの左端がA1であることが前提のため、(2022年2月)
ピボットテーブルの位置を指定できるように追加しました。

↓参考ページ
このページのソースに位置指定を追加
ピボットテーブル作成のサンプル

GoogleAppsScript


function MoveFunction(){
  
  const SOURCE_SHEET="データシート";                    //ピボットテーブル用データのあるシート名
  const SOURCESHEETID="〇×YXf-uabcdiP_ur45tyudU_z23445656Y0";   //ピボットのあるシートのID
  const PIVOSHEETNAME="事業部";                       //ピボットテーブルのあるシート名
  const PIVOTSHOPROW=2;         //ピボットテーブルの開始行 0から数える A3から開始する場合の場合
  const PIVOTSHOPCOLUMN=0;      //ピボットテーブルの開始列 0から数える  A3から開始する場合
  let pivotTableParams;                              //ピボットテーブルを入れる変数
  
  //ピボットテーブルのあるスプレッドシートを取得
  let sheet = SpreadsheetApp.openById(SOURCESHEETID); 
  //ピボットテーブル用データのあるシートを取得
  let sourcesheet=sheet.getSheetByName(SOURCE_SHEET); 
 //ピボットテーブルのあるシートのシートIDを取得する
  let pivotTableSheetId = sheet.getSheetByName(PIVOSHEETNAME).getSheetId(); 

  let fields = "sheets(properties.sheetId,data.rowData.values.pivotTable)";
  let sheets = Sheets.Spreadsheets.get(sheet.getId(), {fields: fields}).sheets;
  


  //--------------シートIDでピボットテーブルを取得する
  for (var i in sheets) {
    if (sheets[i].properties.sheetId == pivotTableSheetId) {      
      pivotTableParams = sheets[i].data[0].rowData[PIVOTSHOPROW].values[PIVOTSHOPCOLUMN].pivotTable;
      break;
    }
  }  
  
//ピボットテーブル用データ範囲の最終行設定
  pivotTableParams.source.endRowIndex = sourcesheet.getLastRow();  

  // 更新されたパラメータを送す
  var request = {
  "updateCells": {
  "rows": {
  "values": [{
  "pivotTable": pivotTableParams
  }]
  },
  "start": {
  "sheetId": pivotTableSheetId,
  "rowIndex":PIVOTSHOPROW,
  "columnIndex":PIVOTSHOPCOLUMN
  },
  "fields": "pivotTable"
  }
  };  

  Sheets.Spreadsheets.batchUpdate({'requests': [request]}, SOURCESHEETID);
}

##上で記述した関数を以下のページを参照してタイマーで更新してます。
Google Apps Script で毎日決まった時刻にスクリプトを実行するトリガー設定

##GoogleSheetsAPIを追加する必要もあります

image.png

6
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6