📖

久しぶりにGASでプロトタイピングしたので、よく使う処理をまとめてみました

yoonchul koh2022/11/02に公開

アンケートとその集計画面をプロトタイピングする機会があったので、GASで作ってみました。
久しぶりにGASを使ったら全て忘れていたので、せっかくなのでメモとして残しておきたいと思います。
なるべくコピペでそのまま使える様にしてあります。

アクティブなスプレッドシートを取得する

const app = SpreadsheetApp.getActive();

特定のシートを取得する

const sheet = SpreadsheetApp.getActive().getSheetByName("アンケート一覧");

セルに行を追加する

const sheet = SpreadsheetApp.getActive().getSheetByName("アンケート一覧");
const addArray = [questionnaireID, questionnaireName];
sheet.appendRow(addArray);

セルから値を取得する

単体セルの場合

const sheet = SpreadsheetApp.getActive().getSheetByName("プロジェクト一覧");
const value = sheet.getRange('A3').getValue();
Logger.log(value);

複数セルの場合

const sheet = SpreadsheetApp.getActive().getSheetByName("プロジェクト一覧");
const values = sheet.getRange('A3:C4').getValues();
Logger.log(values);

結果は 行 x カラム の2次元配列になります。

[
  [A3セルの値, B3セルの値, C3セルの値], 
  [A4セルの値, B4セルの値, C4セルの値] 
]

B3セルの値を取り出す時は、values[0][1]の様にアクセスします。

セルに値を書き込む

const sheet = SpreadsheetApp.getActive().getSheetByName("プロジェクト一覧");
sheet.getRange('A3').setValue('新しい値');

スプレッドシートにスクリプトを実行するボタンを置く

挿入図形描画 で図形を描画します。

挿入された画像を右クリックしてスクリプトを割り当てをクリックします

ここで実行したいスクリプトを指定します。

スクリプトを実行する時に、確認ダイアログを出す

スプリクトを実行するボタンを置くと、、なぜか押したくなるんですよね。
スクリプトを走らせると、いろんなところに影響が出るので、実行する前にはちゃんと確認ダイアログが出て欲しいです。

function updateSummary() {
  var ui = SpreadsheetApp.getUi();
  var title = '更新';
  var prompt = '更新しますか'
  const ok = ui.alert(title, prompt, ui.ButtonSet.YES_NO) === ui.Button.YES;

  if (ok) {
    _updateSummary()
  }
}

後ろに見慣れない === ui.Button.YES;というものがあります。
これは、ui.alert(title, prompt, ui.ButtonSet.YES_NO)の戻り値が "YES", "NO" の文字列で返ってくるため、booleanに変換するために行なっています。

これを実行すると、こんなダイアログが出る様になります。

IDの取得

URLのd/の後ろにあるのがIDとなります。

URLが下記の場合、
https://docs.google.com/spreadsheets/d/1ow3oewrAGcNQHlv2iGG6Buk8AAoJSi4nmJ-AU6CHlA/edit#gid=0

IDは1ow3oewrAGcNQHlv2iGG6Buk8AAoJSi4nmJ-AU6CHlAになります。

フォルダの場合はfolders/の後ろがIDになります。
https://drive.google.com/drive/folders/8B6lsdfjo8CklviuM5NGZyRHlJVDA

フォルダを作成する

ルート配下に作る場合

DriveApp.createFolder(name);

特定のフォルダの中に作る場合

const folder = DriveApp.getFolderById("[フォルダID]");
const newFolder = folder.createFolder("[新しいフォルダ名]");

特定のフォルダにスプレッドシートを作成する

const folder = DriveApp.getFolderById("[フォルダID]");
const ss = SpreadsheetApp.create("[ファイル名]");
const sourceFile = DriveApp.getFileById(ss.getId());
const copiedFile = sourceFile.makeCopy(fileName, folder);
DriveApp.getRootFolder().removeFile(originalFile);

特定のフォルダに直接作成するAPIが見つからずでした。
なので、一度ファイルを作ってから移動(コピーして削除)する様にしています。

Googleフォームに回答用スプレッドシートを追加する

const form = FormApp.openById("[フォームID]");
const sheet = createSpreadSheet();
form.setDestination(FormApp.DestinationType.SPREADSHEET, sheet.getId());
return form

画面だとここから設定できるものです。

フォーム・スプレッドシートをID指定して開く

Googleフォーム

const form = FormApp.openById("[フォームID]");

Googleスプレッドシート

const ss = SpreadsheetApp.openById("[スプレッドシートID]");

以下関数です。

リンク

=HYPERLINK("[リンクURL]", "[表示名]")

集計表にアンケートの結果リンクを置くのに使いました。

GASのコードはこんな感じです。

const sheet = SpreadsheetApp.getActive().getSheetByName("集計");
sheet.getRange('B15').setValue('=HYPERLINK("' + qForm.getSummaryUrl() + '","アンケート結果(グラフ)")')
sheet.getRange('B16').setValue('=HYPERLINK("' + qSheet.getUrl() + '","アンケート結果(生データ)")')

他シートのデータを参照する

=IMPORTRANGE("[スプレッドシートのURL]", "[RANGE]")

複数のスプレッドシートのデータを参照して1つのスプレッドシートにまとめる必要がありました。
頑張れば他のスプレッドシートを直接参照できたかもですが、計算がしやすい様に一度集計用のスプレッドシートに持ってきました。

補足情報

最初色々とググってたのですが、結局ドキュメントにあたるのが一番早かったです。

Googleフォーム
https://developers.google.com/apps-script/reference/forms/form

Googleスプレッドシート
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app

Googleドライブ
https://developers.google.com/apps-script/reference/drive

まとめ

久しぶりにGASを書いてみましたが、エディタも進化していてだいぶ書きやすくなっていました。
GASはプロトタイプが簡単に作れるので結構好きなんですが、触る機会が年に1回くらいなので、いつも忘れてしまって毎回同じことをググっている気がします。

今回は忘れないうちにメモったので、次に作る時にはきっとスタートダッシュできると思います!

レスキューナウテックブログ

日本で唯一の危機管理情報を専門に取り扱う防災Techのスタートアップ、(株)レスキューナウです。当社で活躍するエンジニアの技術ブログを中心に公開していきます。

Discussion

ログインするとコメントできます