見出し画像

Google Apps Script備忘録.

【Rev:2018/10/17】
←【目次】へ戻る

こんにちはryokawa1972です。

【おしらせ】
【NEW】■「ぼくは、よくカップラーメンの消費期限を見落とすので、GAS、LINE Notifyをつかって、LINEで通知されるようにしかける。」のスクリプトを少々改良しました。消費期限通知を開始する残日数が機能していませんでした。そこを修正しております。あと、スクリプトの最適化をしました。修正したスクリプトをそのままコピペしていただければ結構です。併せて、トークンの設定を忘れずにお願いします。(9/13)
■「ぼくは、よくカップラーメンの消費期限を見落とすので、GAS、LINE Notifyをつかって、LINEで通知されるようにしかける。」のスクリプトを少々改良しました。(9/12)
■有料ゾーンにある「ぼくは、よくカップラーメンの消費期限を見落とすので、GAS、LINE Notifyをつかって、LINEで通知されるようにしかける。」を作りました。よろしくお願いします。(9/11)
■「ぼくは、よくメールを見落とすので、GAS、GmailとLINE Notifyをつかって、重要なメールは、LINEで通知されるようにしかける。」の中のソースコードを修正しました。スプレッドシートのA列以外に何かデータが入ってた場合、誤作動をします。そこでスクリプトを修正しました。その新しいスクリプトを掲載しなおしましたので、古いスクリプトを消してコピペしてください。よろしくお願いします。

ということで、勉強した内容を、ちまちま記していきたいと思います。まぁ、私のGoogle Apps Scriptの備忘録ではありますが、せっかくなので、皆さんに発信したいと思います。最初の内は、箇条書きで勘弁してください。ある程度の数が揃ってきたら、体系的になるように編集をしていきたいと思います。お見苦しい点もございますが、よろしくお願いします。
 私の当面の目標は、LINEやtwitterへの投稿ができるようになったり、最近は仮想通貨にもハマってますので、わざわざそこのホームページを見に行くのではなく、Spreadsheetでいろいろ確認ができるといいなと思うところです。なので、OAuthとか、ちょいとハードルが高いことにも挑戦してみたいと思います。(OAuth、ハードル高すぎて理解できません。もうちょっと時間ください。Twitterでたくさんの「いいね」をもらっております。絶対クリアしたい問題なんですが。。。【2018/7/9】。)
 最低の100円で設定させていただきました。でも、基本文法のところは無料で提供させていただきます。本当の入門書を買えば、100円では買えないはずですので。また、売れれば売れる程、価格を上げていきたいなと思います。【2018/8/6】
 以上、よろしくお願い致します。

【もくじ】
1.Google Apps Scriptとは
2.私の備忘録
(1) スクリプトエディタまでの起動方法
(2)Google apps 共通
(3)スプレッドシート
(4)本気でやりたい事:ぼくは、よくメールを見落とすので、GAS、GmailとLINE Notifyをつかって、重要なメールは、LINEで通知されるように、しかける。(有料)
(5)本気でやりたい事:ぼくは、よくカップラーメンの消費期限を見落とすので、GASとLINE Notifyをつかって、LINEで通知されるようにしかける。(有料)


--------------------------------------------------------------------------------------

1.Google Apps Script(GAS)とは

 GASは、Googleが提供しているスプレッドシート、ドキュメント、Gmail、カレンダーなどのアプリに対して、独自に機能拡張させることができるプログラミング言語です。JavaScriptが理解できる人は、簡単かとは思います(ryokawa1972は、JavaScriptを勉強しながら、書いています。)。例えば、スプレッドシートに予定を書いたとします。その予定を、カレンダーに転送するというような芸当ができてしまいます。尚、Googleアカウントを持っている方は、これらの機能をもれなく使うことができますよ。
 ただし、全部が全部JavaScriptと同じかというと、それは違います。そのスクリプトを実行するコンピューターが、GASであれば、Googleのサーバー上なんですよ。自分のPCではありません。よって、GASでは、 Webブラウザに用意されている JavaScriptの機能が使えません。

 適宜、コンテンツを追加をしていく関係で、項目番号などはリナンバーして行きますので、ご了承のほど、よろしくです。


2.私の備忘録

さっそくですが・・・・・・

(1) スクリプトエディタまでの起動方法

スクリプトエディタまでの起動方法は、以下の通りです。まずは、スプレッドシートの例を示します。ここまでは、たどり着いてください。

<>スクリプトエディタをクリックすると・・・・

 見事、スクリプトエディタが現れました。

 プログラムの例として、ソースを張り付けておきますので、そのままスクリプトエディタに貼り付けて、実行してみてください。
 プログラムを実行するときに、

  このような、承認が必要ですウインドウが出てくる時があります。
この場合、
・【許可を確認】をクリックします。
・アカウントを選択します。
・【詳細】をクリックします。
・下の方の【(プロジェクト名)(安全ではないページ)に移動】をクリック
・【許可】をクリック

以上の作業を行ってみてください。
GASは基本的には、下記のように、関数を定義して式を書くだけです。下記ソースの「myFunction」は関数名になります。適宜、分かりやすい名前に書き換えてください。

function myFunction() {
  式;
}


(2)google apps 共通

0)やりたい事:作った関数を実行する。【New:2018/6/13】
以下の画面では、関数myFunctionが中身は何もありませんが、定義されています。これを実行するためには➀の関数名を選んで、➁実行ボタンを押してください。これで、スクリプトが走ります。

1)やりたい事:ログ画面に 値を表示する。【Rev:2018/6/13】
式:Logger.log(値)

function log() {
  Logger.log("Hello World"); //ログ画面にHello Worldと表示させる式
}

【実行結果】
「表示」−「ログ」を開くと

【補足事項】
Logger.log("Hello World")について、「Logger」というオブジェクトの「log」というメソッドを使って、”Hello World"を表示させるという解釈をになります。

2)やりたい事:メッセージボックス、インプットボックスを使いたい【Rev:2018/6/13】
式:Browser.msgBox(値1,値2,ボタンの種類);
式:Browser.inputBox(値1,値2,ボタンの種類);

返り値:string型で、押されたボタンにより、
・msgBoxでは、”ok”,”cancel”,”yes”,”no”が帰ってきます。尚、「X」でウインドウを閉じた時は、"cancel”が入ります。
・inputBoxでは、文字入力できるテキストボックスが現れますので、その入力した内容が返ってきます。ただし、変な仕様と思いますが、キャンセルボタンを押したときは、”cancel”が返ってきます。テキストボックスに”cancel”と入力した結果とキャンセルボタンを押した結果が同じっていう所がちょっと変で注意すべき点です。

ボタンの種類は、オプションですが、下記4種類のプロパティがあります。
➀ButtonSet.OK       "OK" ボタンのみ 
➁ButtonSet.OK_CANCEL   "OK" と"キャンセル"
③ButtonSet.YES_NO     "Yes" と "No" 
④ButtonSet.YES_NO_CANCEL  "Yes" "No" "キャンセル"
 返り値によって、if構文やswitch構文など条件分岐をさせて、その後の処理ができそうです。下記の例は変数ansに押されたボタンがログ画面に表示されます。

function messagebox_test() {
    var ans;
    ans = Browser.msgBox('title', 'text', Browser.Buttons.OK_CANCEL);
    Logger.log(ans);
}

【実行結果】(スプレッドシートから立ち上げた場合、スプレッドシートを選択してください)

【OK】ボタンを押し、スクリプトエディタへ戻って、ログ画面を出してみてください。

ログ画面に「ok」と表示されました。

3)やりたい事:条件分岐をしたい
3-1  if文をつかった条件分岐【Rev:2018/6/13】
式 if (条件式が真) {
          処理1; } else if (条件式が真){
          処理2; } else { 
          処理3; }
      }
*else if句は何個でも使うことができます。(もちろん無しでも構いません)それでも、条件に合わない時は、最後のelse句の内容が実行されます。
以下の例は、score=55ですので、ログ画面には”FAIL”と表示されますね。変数scoreの値をいろいろ変えて試してみてください。inputBoxを使って数値を入力させてもいいかもしれませんね。

function if_test(){
  
  var score=55;

  if (score>80) {
    Logger.log("PASS");
    } else if (score >60) {
    Logger.log("soso..");
    } else {
    Logger.log("FAIL");
    }
  }

3)-2 switch文をつかった条件分岐【New:2018/9/9】
式:switch(値){
   case 条件1:
      式;
              break;
           case 条件2:
      式;
              break
           case 条件3:
      式;
              break;
          default:
      式;
              break:
  }

*case句は何個でも使うことができます。それでも、条件に合わない時は、最後のdefault句の内容が実行されます。下の例は、score=55ですので、ログ画面には”FAIL”と表示されます。変数scoreの値をいろいろ変えて試してみてください。ちなみに、上記if文の例をswitch文に書き換えたものになります。

function switch_test(){
 
 var score=55

 switch (true){
   case score>80:
     Logger.log("PASS");
     break;
   case score>60: 
     Logger.log("soso..");
     break;
   default:
     Logger.log("FAIL");
     break;
   }
 }


5)やりたい事:配列に関する便利なメソッドをまとめておく。
主な内容としては、要素の追加、取得、削除となります。実行結果はログ画面で見れます。まだ、その他、メソッドはたくさんあります。また追加していきますね。【Rev:2018/8/2】

function myArraytest() {
  //まず、初期設定します。下記配列をスタートにしてみましょう。
      var array = ['A','B','C','D'];
  
  //先頭に値を追加しましょう。ここでは'0'を追加してみましょう。
    array.unshift('0'); 
    Logger.log(array);  // 0,A,B,C,D
  
  //先頭の値を削除しましょう。
    array.shift(); 
    Logger.log(array);  // A,B,C,D
    
  //末尾に値を追加しましょう。ここでは'0'を追加してみましょう。             
    array.push('0'); 
    Logger.log(array);  // A,B,C,D,0
  
  //先頭の値を削除しましょう。
    array.pop(); 
    Logger.log(array);  // A,B,C,D
  
  //値を取り出してみましょう。
  //配列の先頭は0番目、次は1番目、2番目・・・となっていきます。
  //それでは、この配列の’C'を取り出してみましょう。
  //[]の中に指定する数字は2になりますね。
    Logger.log(array[2]); // C

  //配列内の要素の数を取得してみましょう
    Logger.log(array.length); //4.0   

}


(3)スプレッドシート

まず、事始めに、シートをオブジェクト化しましょう。

1)やりたい事:シートをいろいろいじれるように、オブジェクト化する。
1)−1 やりたい事:現在アクティブなシートをオブジェクト化【Rev:2018/6/13】

式:SpreadsheetApp.getActiveSheet()

function myFunction1(){
 //アクティブなシートをオブジェクト化して「sheet」でいじれるようにする。
  var sheet = SpreadsheetApp.getActiveSheet(); 
 }

1)−2 やりたい事:シートを指定し、それをオブジェクト化【Rev:2018/6/13】
.getActivesheet()に引き続き、.getSheetByname(シート名)を追加します。
式:SpreadsheetApp.getActiveSpreadsheet().getSheetByName(シート名) 

function myFunction2(){
//シート2をオブジェクト化して「sheet」でいじれるようにする。
 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート2");
}

2) やりたい事:シートの内容をクリアする【Rev:2018/6/13】
式:オブジェクト名.clear()

function sheet_clear(){
  var sheet = SpreadsheetApp.getActiveSheet(); 
  sheet.clear(); //シートの内容をクリアする。
 }

3)やりたい事:指定した場所のセルに値を入れる【Rev:2018/6/13】
3)−1  1つのセルに1つの値を入れるとき
式:(オブジェクト名).getRange(位置).setValue(値);
「位置」の指定方法は以下の方法でできます。
 ①行番号,列番号 【Rev】2018/6/14
 ②A1形式

function set_value(){
  var sheet = SpreadsheetApp.getActiveSheet();

  //➀セル(1,1)にhogeを入力する。 //セル(1,1)=セルA1
  sheet.getRange(1,1).setValue('hoge');
  
  //➁セルB1にhogeを入力する。
  sheet.getRange("B1").setValue('hoge');
}

3)−2 複数のセルに複数の値を入れるとき【Rev:2018/6/13】
式:sheet.getRange(row, column, numRows, numColumns).setValues(値)
.setValuesと複数形になっているところに注意です。

function set_value_with_loop() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var i; //ループを回す変数を宣言する。
  var data = []; //変数dataを配列として宣言しておきます。

  //["A","B"]という配列を1000個つくります。
  for (i = 1; i <= 1000; i++) {
    data.push(["A","B"]);
  }
  //一気にシートへ表示させてみましょう、
  sheet.getRange(1, 1, 1000, 2).setValues(data);
  
}

もちろん、 sheet.getRange(位置).setValue('A');とかをを1000回繰り返してもできるのですが、やってみると激遅です。一旦、配列で表示させたい内容を作っておいて、後から一気に表示させましょう。ともかくスピードが全然違います。

4)やりたい事:指定した場所のセルを読み取る。【Rev:2018/6/13】

式:(オブジェクト名).getRange(位置).getValue(値);
「位置」の指定方法は以下の方法でできます。
①行番号,列番号 【Rev】2018/6/14
②A1形式

function get_cell_value(){
 var sheet = SpreadsheetApp.getActiveSheet();
 //➀セル(1,1)の内容をログ画面へ出力
 Logger.log(sheet.getRange(1,1).getValue());
 
 //➁セルB1の内容をログ画面へ出力
 Logger.log(sheet.getRange("B1").getValue());
}


 無料部分はここら辺までとします。出版するというとすごく敷居が高い感じがしてました。だけど、noteというプラットフォームによって、その敷居を大きく下げたと思います。とは言え、この備忘録をたくさん買ってもらえる事とは別の話。たくさん買ってもらえるためには、ryokawa1972の書き物がたくさんの人に役に立つようなものでなければなりません。もちろん、ryokawa1972を知っている人でなければなおさらです。突然ですが、一応、ここまでを無料で参照できるようにします。もちろん、アップデートしていきますので、よろしくお願いします。この後は、有料になりますが、Google Apps Script、GMAILとLINE Notifyを連携したアプリを掲載しました。何ができるかというと、見落としがちなGMAILを良く見ているLINEに通知が来れば、メールの見落としが減るだろうという事で作成しました。まずは最低の100円で出します。売れれば売れる程、値上げをしていければいいなと思いますのでよろしくお願いします。

以上、ryokawa1972でした。


【Rev:2018/9/11】
この次から有料ゾーンです。下記に書いてある通り、GAS、GmailとLINE Notifyを組み合わせたツールを2つ作成しましたので公開します。
①重要なメールを見落とさないために、LINEを使って通知させる。
下図はそのイメージ。

②カップラーメンの消費期限前にちゃんと食べるようにLINEを使って促す。
下図はそのイメージ。

ここまでお付き合いいただき、ありがとうございました。GAS文法とかまだまだ、未完成ですが。。。
←【目次】へ戻る

ここから先は

6,358字 / 14画像

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?