Google スプレッドシートについて学ぶ (5)

前回はを作成しました。

今回は日付の自動入力機能を作成します。

とりあえずGASを動かす

メニュー > 拡張機能 > Apps Script より

スクリプトを実行する

メッセージボックスに Hello, World! と表示するスクリプトを記述して保存します。

function myFunction() {
  Browser.msgBox("Hello, World!", Browser.Buttons.OK)
}

メニューから実行すると、スプレッドシートの方でメッセージボックスが表示されます。

日時の自動入力を行う

スコアシートの日時を手で入力するのは手間であるため、スコア記入時に自動で入力されるようにします。正確なデュエル日時とはなりませんが、1デュエルごとにスコアを記入するのであればデュエル日時にかなり近い日時が入力されることになるため、時間帯ごとに分析を行いたい場合などには有効な情報になると思います。

自動入力する条件を考える

以下の条件について考えていきます。

  1. どのシート、セルを編集したタイミングで自動入力をするのか
  2. 編集したセルの入力値
  3. 自動入力前の日時の入力値

どのシート、セルを編集したタイミングで自動入力をするのか

まず、シートはもちろんスコアシートを入力したタイミングとなります。別のシート、例えばリストシートを編集して日時が自動入力されるようなことがあると困ってしまいます。

次にセルについて。対戦数は連番のため、1戦ごとに入力するよりは、事前に入力しておくことの方が多いと思われます。また、使用デッキについてはDCを通して1デッキしか使用しないことも考えられ、その場合は連番と同様に事前に入力しておくことが考えられます。そのため、対戦ごとに入力する可能性の高い先後~累計DPの列を編集したタイミングを条件としていきます。

編集したセルの入力値

通常はコイントスのタイミングで先後、またはデュエル後に一通りの結果を入力すると思いますが、誤入力や次回のDC用に入力内容を消すことも考えられます。

この場合、編集行の入力内容はブランクとなりますが、これをトリガーに日時に自動入力がなされてしまうと自動入力された日時をさらに消すという二度手間になってしまうため、ブランク以外に編集された場合を条件とします。

自動入力前の日時の入力値

日時に何かしら入力がる、もしくはブランクの状態があります。

日時が入力済の状態で同一行のセルをどこか編集した場合に日時が編集日時で更新されてしまうと、デュエル日時ではなく更新日時という概念に変わってしまい、目的が変わってしまいます。あくまで日時がブランクの状態であった場合のみに自動入力し、デュエル日時に近い日時を入力するという目的に沿うものとします。

処理を考える

onEdit(e) はスプレッドシートの変更や修正を行った場合に起動されるため、これを利用して処理をしていきます。

イベントオブジェクトから次のようにシートの情報やセルの情報を取得できます。

メソッド内容
e.source.getActiveSheet()アクティブシートを取得
e.source.getActiveSheet().getName()シート名を取得
e.range.getRow()編集セルの行数を取得
e.range.getColumn()編集セルの列数を取得

これらに加えて、 getRange()getValue()setValue() を使用して実際に処理を記述していきます。

const sheets = Object.freeze({
  scoreSheet: {
    name: 'スコアシート',
    rows: {
      numberOfRow: 1,
      myDeck: 2,
      orderOfAttack: 3,
      opponentsDeck: 4,
      result: 5,
      dp: 6,
      duelDatetime: 7,
      memo: 8,
    },
  },
})

// 編集時
function onEdit(e) {
  // アクティブシート
  const sheet = e.source.getActiveSheet()
  // 編集されたセルの行数、列数
  const column = e.range.getColumn()
  const row = e.range.getRow()

  // スコアシート編集時
  if (sheet.getName() === sheets.scoreSheet.name) {
    // 編集行の日時
    const duelDatetimeRange = sheet.getRange(row, sheets.scoreSheet.rows.duelDatetime)
    
    // スコアシートの先後~DPを編集し、編集セルが入力済かつ日時がブランクの場合
    if (sheets.scoreSheet.rows.orderOfAttack <= column && column <= sheets.scoreSheet.rows.dp
            && e.range.getValue() != '' && duelDatetimeRange.getValue() === '') {
      // 編集行の日時に現在日時を入力する
      duelDatetimeRange.setValue(Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd hh:mm:dd'))
    }
  }
}

上記スクリプトを実装した後のスプレッドシートの動きはこのようになります。

まとめ

今回は以下の内容について学びました。

  1. GASの簡単な操作

次回の内容は未定です。

コメント

タイトルとURLをコピーしました