SpreadsheetApp.getUi alertのui.ButtonSet.YES_NOの注意点

ui.ButtonSet.YES_NOはYES, NOを返す

Google Apps Scriptを使用しているとSpreadsheetApp.getUiでJavaScriptのconfirmダイアログに相当するもの(はい・キャンセルを表示)を表示させて、どちらがクリックされたかで条件分岐したいことがある。

JavaScriptだとconfirmを使用して以下のようにすればboolean(true or false)を取得できる。

var flag = confirm('Sample')
console.log(flag)
// OKだとtrue, キャンセルだとfalse

しかし、GASでconfirmダイアログに相当するものを使用した場合、true, falseではなくYES, NOの文字列が返ってくる。

function alert() {
  const ui = SpreadsheetApp.getUi()
  const title = 'Sample'
  const prompt = 'Click button'
  const flag = ui.alert(title, prompt, ui.ButtonSet.YES_NO)
  Logger.log(flag)
  // 「はい」ならYES, 「いいえ」ならNO

  Logger.log(flag === 'Yes')
  // 大文字ではないのでfalse

  Logger.log(flag === 'YES')
  // 大文字なのでtrue
}

Google Apps Scriptの公式ドキュメントには「input field, and "Yes" and "No" buttons.」というコメントがあるのだが、これを返り値だと勘違いしているコードがたまにあるので注意が必要だ。

Class Ui  |  Apps Script  |  Google Developers

ui.alertの結果をbooleanで受け取る方法

前述のようなミスを防ぐにはui.alertの結果をbooleanで受け取れば解決できる。

やり方はui.alert(title, prompt, ui.ButtonSet.YES_NO)のあとに「=== ui.Button.YES」を追記するだけだ。

こうすれば返り値がtrue, falseのどちらかになるので条件分岐で間違える可能性を減らすことができる。

function alert() {
  const ui = SpreadsheetApp.getUi()
  const title = 'Sample'
  const prompt = 'Click button'
  const flag = ui.alert(title, prompt, ui.ButtonSet.YES_NO) === ui.Button.YES
  Logger.log(flag)
  // 「はい」ならtrue, 「いいえ」ならfalse
}