0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

スプレッドシートで別シートにストックされた内容から更新する

Posted at

#はじめに
研修で、無料かつノーコードでwebアプリ開発可能なGlideを扱った。
Glideでは、Googleアカウントと紐付け、自分のドライブ上のスプレッドシートをデータベースとして扱うことができる。
アプリを作っているときに、インプットしたデータから元データの数値を更新したかったが、Glideだけでは対応できなかった。
そこで、スプレッドシートでGAS(Google Apps Script)を使いスクリプトを組むことにした。
(ExcelでいうVBAでマクロを組むのと同じ感覚)

筆者は研究室で楽をするために、実験装置を自動で動かしデータを収集整形するために、Excelでマクロを組んだことがあるくらいで、スプレッドシートでマクロを組むのは初めてで、GASも初めて触った。
変なところもあるかもしれないので、指摘していただけると助かります。

#スプレッドシート中身
###シート構造

シート名 master data
役割 データを集約 アプリからのインプットを蓄積

dataのシートへはGlideのFormを用いて入力されたデータ群

###シート中身
今回は簡易的にmasterとdataともに同じ項目

A B C
1 name score time stamp
2 A 10 5/19
3 B 4 5/20

のように名前・点数・更新日時のようにした。

#やりたいこと
dataに蓄積された点数などのデータを名前でリレーションし、masterのデータを更新し、更新し終えたらdataから消す。

#GASスクリプトエディタの開き方
スプレッドシート上部の「ツール」→「スクリプトエディタ」で表示可能
たまに開けない人がいるらしいが、原因はChromeでデフォルトのGoogleアカウントで編集しようとすればほぼ解決するらしい。

参考:「現在、ファイルを開くことができません」と出てスクリプトエディタが開かない,検温くん

#実際に組んだスクリプト

/** @OnlyCurrentDoc */

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var c_sheet = spreadsheet.getSheetByName("data");
  var v_sheet = spreadsheet.getSheetByName("master");

  while (c_sheet.getLastRow()!=1){
    var flag = 0;
    for (let i=2; i<=v_sheet.getLastRow(); i++){
      if (v_sheet.getRange("A"+i).getValue() == c_sheet.getRange("A2").getValue()){
        v_sheet.getRange("A"+i+":C"+i).setValues(c_sheet.getRange("A2:C2").getValues());
        var flag = 1;
        break;
      };
    };

    if (flag != 1){
      v_last = v_sheet.getLastRow() + 1;
      v_sheet.getRange("A"+v_last+":C"+v_last).setValues(c_sheet.getRange("A2:C2").getValues());
    }

    c_sheet.deleteRows(2);
  };

};

###手順
1.dataシートにデータがあるかチェック
 1.1あれば2へ
 1.2なければ終了
2.dataシートの一番上のデータを取得
3.masterシートと名前をキーとして一致するものを検索
 3.1.一致すればデータ上書き
 3.2.一致しなければ一番うしろに追加
4.一番上のデータを削除
5.終了 → 1へ戻る。

#トリガーについて
トリガー:組んだマクロを実行させるタイミング
指定しなければ、自分で実行する必要がある。
###GASにおけるトリガーの種類
Open(起動時)
ファイルが開かれたときに実行

Edit(編集時)
セル内容が変更されたときに実行
*スプレッドシートのみ

Change(変更時)
スプレッドシートの構造が変更されたときに実行
シート・列の追加・削除など
*スプレッドシートのみ

Form submit(フォーム送信時)
フォーム送信 or フォーム回答がスプレッドシートに書き込まれたときに実行

Time driven(時間主導型)
一定時間や特定日時に実行

###トリガー設定方法
色々ググったが昔のUIのものばっかで、現在(2021/5/20)ではGASのスクリプトエディタ左側の「目覚まし時計」マークから設定できる。

###トリガー設定
最初に"Edit"でトリガーを設定したが、Glideからのセル変更では
トリガーになってくれなかった。

そこで、今回は"Time driven"で1分おきにトリガーが発生し、マクロを実行するようにした。

参考:【GAS】トリガーとは!トリガーの種類と使い方を解説,takasakisan,(2019-08-27)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?