【スプレッドシート入門】オセロを作ってみる!③

Googleスプレッドシート
  • スプレッドシートとGASで作るオセロの第3回です。
  • 第3回はGUIのベースとなる部分を作っていきます
スポンサーリンク

GASのonEditトリガー

前回までは石を置く動作を関数として作成しました。

今回はその関数を、シート上の操作によって呼び出すという部分を実装します。

そのためにGASに用意されている、シンプルトリガーというものを使ってみます。

試しに、AppsScriptに新しいスクリプトを用意し、次のようにコードを入れてみます。

function onEdit() {
    Browser.msgBox('テスト');
}

この状態でシートを適当に編集すると、次のように表示されます。

onSelectionChangeトリガー

このように、GASには一定の動作をベースに動くように用意されたトリガーがいくつか存在します。

ただ、onEditだと、石を置く動作として「1」と入力しなければなりません。

また、setStoneによってほかのセルが編集されると、さらにそれをトリガーにonEditが動いてしまいます。

そこで今回は、onSelectionChangeというトリガーを使用します。

ただこのトリガーはやや不安定で、一度保存しても動かないことがあります。

そういった場合はスプレッドシートを閉じてもう一度開いたり、といった作業を行うことで動くようになることがあります。

実装してみる

実際に動くようになれば、onSelectionChangeをベースにsetStoneを呼び出すようにしてあげればOKです。

function onSelectionChange(e){
  if (e.range.getRow() <= 8, e.range.getColumn() <= 8){
    setStone(e.range.getRow(), e.range.getColumn(), 1);
  }
}

function setStone(c, r, s){
  var flag = false
  if (sheet.getRange(c, r).getValue() == 0) {
    for (let i = -1; i <= 1; i++){
    for (let j = -1; j <= 1; j++){
      if (sheet.getRange(c + i, r + j).getValue() == -1 * s){
        for (let k = 2; k <= 8 ; k ++){
          if (c + i * k < 1) continue;
          if (r + j * k < 1) continue;
          if (sheet.getRange(c + i * k, r + j * k).getValue() == s){
            for (let l = 0; l < k ; l ++){
              sheet.getRange(c + i * l, r + j * l).setValue(s)
            }
          }
        }
      }
    }
    }
  }
}

このコードだと、「1」の石を置くことしかできませんが、実際に「1」とおきたいところでセルを選択すると、setStoneが呼び出され、石が置かれるようになります。

コメント

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