見出し画像

【GAS】onOpen スプレッドシートを開いたときの処理 メニュー表示と最終行セル移動

先日、最終行の移動について書いた。

で、現時点で、スプレッドシートを開いたときに自動的にしたいのは、メニュー表示と最終行セル移動の二つが多いかな。
という単なるメモ。
二つをまとめたコード例は下記の通り。

コード例

/**
 * 更新日 2021/12/23
 * 更新者 XXXXXX
 * 
 * シンプルトリガー onOpen()
 * 
 * <プロジェクト概要>
 * スプレッドシートを開いたときに自動的に以下を実行する
 * ・独自メニューをシートに追加する
 * ・スプレッドシートの最終行にセルを移動
 */
function onOpen() {
  // const ui = SpreadsheetApp.getUi();
  // ui.alert('★注意★\n\n現在、スクリプトを改修中です。改修終了まで、このシートの使用は控えてください。\nご協力お願いいたします。', ui.ButtonSet.OK);

  addMenu();
  moveToLastRow();
}

/**
 * <function概要>
 * 独自メニューをシートに表示する 汎用性、使いまわしの観点から、base class が良いか。
 * https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet?hl=en#addmenuname,-submenus
 * https://developers.google.com/apps-script/reference/base/menu?hl=en
*/
function addMenu() {
  SpreadsheetApp.getUi()
    .createMenu('My Menu')
    .addItem('01_My Menu Item', 'myFunction01')
    .addItem('02_My Menu Item', 'myFunction02')
    .addItem('03_My Menu Item', 'myFunction03')
    .addItem('04_My Menu Item', 'myFunction04')
    .addSeparator()
    .addItem('05_My Menu Item', 'myFunction05"')
    .addItem('06_My Menu Item', 'myFunction06')
    .addItem('07_My Menu Item', 'myFunction07')
//       .addSubMenu(SpreadsheetApp.getUi().createMenu('My Submenu')
//           .addItem('One Submenu Item', 'mySecondFunction')
//           .addItem('Another Submenu Item', 'myThirdFunction'))
    .addToUi();
}




/**
 * <function概要>
 * スプレッドシートの最終行にセルを移動
 * 
 * 参考URL
 * https://note.com/kawamura_/n/nb1865dfb3c77
 * 
 * セルが空白でもとにかく最終行に移動するときは getMaxRows() を使用
*/
function moveToLastRow() {
  //  const sheet   = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Name');
  console.log(sheet.getName());
  const lastRow = sheet.getRange(1, 7).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  console.log(lastRow);
  sheet.getRange(lastRow + 1, 1).activate();
}

//   const ss = SpreadsheetApp.getActiveSpreadsheet();
//   const sheet = ss.getActiveSheet();
//   const lastRow = sheet.getMaxRows();
//   sheet.getRange(lastRow, 1).activate();

改修中のメッセージもコメントアウトで入れてある。

function onOpen() の中に全部書いてもいいけど、
機能ごとに切り分けたほうがメンテしやすいかなと思った。
こういう、考え方?基準?みたいなやつ、なんかあると思うんだけど、何ていうんだろう。

別件で、似たようなコードを複数行書いてて、もったりしてて、かったるいので、それをなんとかしたい。なんかこう、ループ処理とか反復メソッドとか、とにかく、なんかいい処理があるはずなんだけど、よくわからんくなってきた。

今日はそんな感じです。


追記

GitHub


いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!