ZeroScript

ゼロからわかるスクリプト

【こう書く】GASでシートをソートする方法 | Google スプレッドシート

世の中に出回る「Googleスプレッドシートをソートする」コード。動けばいいんですけど、イケてないように見える。

解説も欲しいなとも思ってる、そこのキミッ

コード

はい。 ということで、どん。

/**シート名降順で並べ替える*/
function sortSheet() {
    const SS = SpreadsheetApp.getActiveSpreadsheet();
    const sheets = SS.getSheets();
    /**ソート済み */
    const map = sheets
      .reduce((m, sheet) => {
        const name = sheet.getName();
        return [...m, { sheet, name }];
      }, [])
      .sort((a, b) => {
        if (a.name > b.name) return 1;
        if (a.name < b.name) return -1;
        return 0;
      });
    // ソート部
    for (let i = 0; i < map.length; i++) {
      const sheetIndex = i + 1;
      const { sheet } = map[i];
      sheet.activate();
      SS.moveActiveSheet(sheetIndex);
    }
}

解説

シート順を変えるメソッドは、moveActiveSheetでSpreadsheetクラスにあります。 そのため、sheet.move(1)みたくはできません。

※以下のコードは、上記コードを抜粋し一部変更を加えたものです。単体でコピペしても期待通りの挙動はしません。上記コードをコピペしてください。

  • step1. moveActiveSheetは、現在アクティブなシートの位置を変えるメソッドです。 そのため、ソート対象のシートを事前にactiveにする必要があります。
// 事前にアクティブ
sheet.activate();
// アクティブなシートをsheetIndex番目に移動
SS.moveActiveSheet(sheetIndex);
  • step2. ということは、sheetをシート名の降順にして、順番に呼び出せるようにしておけば良さそう

sheetそのものとシート名が、シート名の降順になったものが、mapです。

    const map = sheets
      .reduce((m, sheet) => {
        const name = sheet.getName();
        return [...m, { sheet, name }];
      }, [])
      .sort((a, b) => {
        if (a.name > b.name) return 1;
        if (a.name < b.name) return -1;
        return 0;
      });

上の抜粋部分では、sheetsreduceして、sortしているのが変数mapに格納されています。

reduceが終わった段階では、 例えばこんな感じになります。

    [
      {
        sheet: oxox, // なにかしらのシート
        name: "3abc", // シート名
      },
      {
        sheet: oxox, // なにかしらのシート
        name: "1abc", // シート名
      },
      {
        sheet: oxox, // なにかしらのシート
        name: "2abc", // シート名
      },
    ];

これがsortされると最終的に変数map

    [
      {
        sheet: oxox, // なにかしらのシート
        name: "1abc", // シート名
      },
      {
        sheet: oxox, // なにかしらのシート
        name: "2abc", // シート名
      },
      {
        sheet: oxox, // なにかしらのシート
        name: "3abc", // シート名
      },
    ];

な感じになります。

あとは、for文でmapを順番に取り出していけばよいです。

ちなみに

moveActiveSheet(sheetIndex)sheetIndexに当たる部分は、1から始まる数字を入れます。

Google スプレッドシートは1から始まるindexか、0から始まるindexなのか、コードを書いていて分からなくなることが多々あります。

変数名をindex0index1のようにすると良いのかもなと思っている。

以上!

まとめ

SpreadSheetクラスのmoveActiveSheetを使ってアクティブなシートの位置を変えるのが、シートソートの肝です。

これが分かればきっと応用も効くはず!

ではまた。

【GAS入門】感覚で分かる!第3回初めての Google Apps Script

f:id:tabemi:20210603220011j:plain

どうも、たべみです。

今回は、GAS入門コースの第3回目です。

前回は、GASでスプレッドシートを扱う際の基本の3ステップのうち、
2つ目の「値を編集する」前段階として、値のアクセス方法についてお伝えしました。


基本の3ステップ

  1. シートの値を取る
  2. 値を編集する
  3. シートに値を戻す

今回は満を持して第2ステップである「値を編集する」を解説していきます。


前回の記事は、こちらです。

tabemi.hatenablog.com

1.前回までの復習

f:id:tabemi:20210602114433p:plain
Googleスプレッドシートにあ~な行を書いた

現在スプレッドシートには、あ~な行のあいうえお表が作成してあり、プログラムで取得し、それを cosole.log(); で出力させました。

前回までのコード

function myFunction() {

  const ss = SpreadsheetApp.getActiveSpreadsheet(); 
  const sheet = ss.getSheets()[0]; 
  const values = sheet.getDataRange().getValues();
 
  console.log(values);
  console.log(values[1][3]); 
  console.log(values[1]); 
  console.log(values[3][4]); 
}
f:id:tabemi:20210602125901p:plain
前回のログ出力

2次元配列の中身

values 0列目 1列目 2列目 3列目 4列目
0行目 あ行 か行 さ行 た行 な行
1行目
2行目
3行目
4行目
5行目

2.値を編集する

前回、値を編集するには、2次元配列を操作する知識が必要だとお伝えしました。

今回の入門コースでは、あくまでGASでスプレッドシートを自動化する際の考え方を解説する記事ですので、深入りはしません

ご了承ください。

とはいっても、何も操作しないのは芸がないので、「複雑ではない値の変更」をやっていきます。

2-1.値を変更する

では、例として0列目にあるすべての文字の語尾に (´∀`) を追加してみましょう

values 0列目 1列目 2列目 3列目 4列目
0行目 あ行 か行 さ行 た行 な行
1行目
2行目
3行目
4行目
5行目

まずは、下のコードの通りに記述してください。

//で始まるコメントの写しは不要です。

function myFunction() {

  //ここからシートの全ての値を取得するテンプレ
  const ss = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシートを取得する
  const sheet = ss.getSheets()[0]; //一番右にあるシートを取得する
  const values = sheet.getDataRange().getValues();//シートのすべての値を取得する
  //ここまでがおまじない
  //2次元配列というデータの形でシートの値が values として取得できた。

  //console.log( ?? )という形で、
  //データの中身を関数実行時に画面下部のウィンドウで見ること(出力)ができる

  console.log(values);
  console.log(values[1][3]); 
  console.log(values[1]); 
  console.log(values[3][4]); 
  
  //ここから値の変更
  console.log('ここから繰り返し');

  //繰り返しテンプレート
  //for (let i = 0;  i < values.length; i++){
    //console.log(values[i][0]) => 0列目を繰り返し
    //処理内容
  //}
  for (let i = 0 ;  i < values.length; i++){
    console.log(values[i][0]) // => 0列目を繰り返し
    values[i][0] = values[i][0] +"(´∀`)";
  }

  console.log('最後の出力↓');
  console.log(values);
  
}

2-2.ログを確認する

▶実行し、ログを確認してみましょう!


するとログの一番最後の行の console.log(valeus) の出力結果に注目すると0列目に絵文字が追加されています

f:id:tabemi:20210603210928p:plain

//2次元配列を縦に繰り返すときのテンプレート
for (let i = 0 ;  i < values.length; i++){
  console.log(values[i][0]) // => 0列目を繰り返し
  values[i][0] = values[i][0] +"(´∀`)";
}

ログをよく見ると、あ行、あ、い、う、え、お、と2次元配列の0列目が出力されていることも分かります。

console.log(); の数と出力の数があっていないじゃないか!と思われた方は鋭いです。

確かに「ここから繰り返し」から「最後の出力↓」までに、合計6つ出力があるにもかかわらず、コード上では1つの console.log(); しかありません。


2-3.繰り返しのテンプレート


真相は「1つのcosole.log(); が6回実行されている」ということです。

もう少し抽象的に言うと、
同様の処理がvaluesの行数分だけ繰り返されている」ということができます。


同様の処理をvaluesの行数分だけ繰り返すためには、下に示すようにコード書き、必要に応じて処理を書き換えます

処理を書き換える部分以外は、もはやテンプレートといっても過言ではありません。

//2次元配列を縦に繰り返すときのテンプレート
for (let i = 0 ;  i < values.length; i++){ //ここから
  console.log(values[i][0]) // => 0列目を繰り返し
  //処理を書き換える
  values[i][0] = values[i][0] +"(´∀`)";

  //ここまで処理を書き換える
} //ここまでが繰り返し処理


ソースコードをみて、なんか難しいこと書いてある!と思われた方、好奇心が素晴らしいです。

しかし、ここは怠慢になりましょう

おそらく学び始めの方なら、
とりあえず使えた=>少し慣れてきた。カスタマイズしたい=>調べる。
という段階を経るのではないでしょうか。

そのため今回は、
知識として「forは繰り返しの処理」という一点のみ伝えます。

そして「同様の処理をvaluesの行数分だけ繰り返す」には、上に示したテンプレートを使用しましょう。

//頭の中はこのくらいでOKです。

for(なんとかかんとか){
  //繰り返せるんだ!!
}

2-4.繰り返しの中身

では、どのように処理がなされているのか、繰り返しの中身を追っていきましょう。

//0回目
console.log(values[i][0]) // => あ行
values[i][0] = values[i][0] +"(´∀`)"; 

cosole.log(); はもうみなさんご存じですね。ログを出力します。
一番初めの出力は、ログを確認すると間違いなく「あ行」であるようです。


次に、console.log(); の下のプログラムの意味をお伝えします。

values[i][0] = values[i][0] +"(´∀`)"; //  これは何?

「変数」と同じように、
イコールのあるプログラムは、イコールを挟んで右辺の処理結果が、左辺に代入されます。


これを一番初めの処理を例に具体的に言い換えると、
あ行を出力するvalues[i][0]の値 は、あ行と (´∀`) を足したもの」ということができます。

//左辺の値は、values[i][0]と絵文字を足したもの
values[i][0] = values[i][0] +"(´∀`)";

そしてこの処理をすることによって、 あ行 の語尾に (´∀`) が追加されます

試しに下のように書き加えて出力してみましょう!

//0回目
console.log(values[i][0]) // => あ行
values[i][0] = values[i][0] +"(´∀`)";
console.log(values[i][0]); // => あ行(´∀`)

確かに、右辺の結果が左辺に代入されたようです!

その他、一番初めの処理に続く処理でも同様です!

f:id:tabemi:20210603215708p:plain
console.log(); を追加した後の出力結果

ログで見られる通り、あ行(´∀`) の後、 console.log(values[i][0]); は「あ」を出力してます。そして今度は、(´∀`) を足し、、、と繰り返されていくのです!

なんとなくもやもやする、、という方、ぜひ追加したconsole.log(values[i][0]; の下に次のコードを追加してみてください。

console.log(values[i][0]) // => あ行
values[i][0] = values[i][0] +"(´∀`)";
console.log(values[i][0]); 
console.log( i ); //付け加える

理解のきっかけになると思います!

以上が、今回の説明となります。
2次元配列の操作、つまり2番目のステップである、「値を編集する」についてお伝えしました。

2-6.ざっと復習

for は繰り返し処理
下のように書くと、列数だけ繰り返し処理ができる。

//2次元配列を縦に繰り返すときのテンプレート
for (let i = 0 ;  i < values.length; i++){ //ここから
  console.log(values[i][0]) // => 0列目を繰り返し
  values[i][0] = values[i][0] +"(´∀`)";

} //ここまでが繰り返し処理

詳しくは、2次元配列の知識となります。

さらに解説したいところですが、また別の機会に譲るとします。

3.最後に

今回は、2次元配列 values の値を編集しました。
そしてそれは、2次元配列の操作は for を使って繰り返し処理をし実現したのでした。


値を取得した直後↓

values 0列目 1列目 2列目 3列目 4列目
0行目 あ行 か行 さ行 た行 な行
1行目
2行目
3行目
4行目
5行目

値を編集した後↓

values 0列目 1列目 2列目 3列目 4列目
0行目 あ行(´∀`) か行 さ行 た行 な行
1行目 あ(´∀`)
2行目 い(´∀`)
3行目 う(´∀`)
4行目 え(´∀`)
5行目 お(´∀`)

(´∀`) がたくさんいます


このコースの目的は、GASでスプレッドシートを操作する考え方を学ぶことでした。
そして今回までで、3ステップのうち、2ステップをお伝えしてきました。


基本の3ステップ

  1. シートの値を取る
  2. 値を編集する <= 今回はここまで
  3. シートに値を戻す

次回は、最後のステップである、「シートに値を戻す」方法についてお伝えしていきます!

今回はこの辺で失礼します!

ではでは~

【GAS入門】感覚で分かる!第2回初めての Google Apps Script

f:id:tabemi:20210602125416j:plain

どうも、たべみです。

前回に引き続き、GASの入門コースです。

入門段階では、まずGASを書く上で重要な考え方を頭に入れます。

その考え方とは、以下の3ステップで自動化を行うということでした。

  1. シートの値を取る
  2. 値を編集する
  3. シートに値を戻す

そして今回は、2番目について解説していきます。


前回の記事はコチラ
tabemi.hatenablog.com

1.値を編集するために

では、全体の流れの2番目の「値を編集する」点についてご説明します。


1-2.前提


値を編集するには、プログラミングの知識が必要です!(オオウ)


逆に言えば、値を編集する以外はコピペで行けます。


そしてGASにおいて「値の編集」は2次元配列の操作を意味します。


つまり、GAS入門における必要知識は、「2次元配列の操作」です!

1-3.スプレッドシートにあいうえお表を書く

前回、スプレッドシートになんの数字も文字も入れていなかったので、画像のように「シート1」にあいうえお表を作成してみてください。

全部書くのは大変なので、「な行」までで大丈夫です。

f:id:tabemi:20210602114433p:plain
Googleスプレッドシートにあ~な行を書いた

1-4.2次元配列の操作

では、2次元配列の操作とはどのようなものでしょうか。

前回のソースコードをこのように記述してみてください。

function myFunction() {

  const ss = SpreadsheetApp.getActiveSpreadsheet(); 
  const sheet = ss.getSheets()[0]; 
  const values = sheet.getDataRange().getValues();
 
  console.log(values);
  console.log(values[1][3]); 
  console.log(values[1]); 
  console.log(values[3][4]); 
}

前回までの復習ですが、

values にシートの値がすべて入っています。

ここから新しい知識です。

console.log ( ?? ); でその中身を見ることができます。



console.log(values); はvaluesの中身を見ることができるプログラムとなります



1-5.プログラムを実行する

では、実際に、console.log( ?? ); の中身を見るためコードを実行します
※中身を見るためにはコードを実行する必要があります。


先ほどコードをコピペしたエディタ画面の上部に注目してみましょう。再生ボタンのようなアイコンがあるかと思います。押してみましょう。

f:id:tabemi:20210523162409p:plain
実行ボタンをクリック

すると、、ウィンドウが出てきますね。。

f:id:tabemi:20210523162329p:plain
ウィンドウが出てくる。「権限を確認」をクリック。キャンセルは押しません。

これの処理方法は以下の記事にまとめてあります。とはいっても30秒ほどで完了するので気楽にいきましょう!!
選択肢にはすべてYESを選ぶという気持ちでOKですよ。
tabemi.hatenablog.com


上の承認作業終了後、黄色く「実行完了」が出ていればOKです!

でない!という方、もう一度実行ボタンを押してみましょう。

2.値の様子を見る

これで、コードの実行ができました。

2-1.console.log() の行方

では、「実行完了」のウィンドウをよく見てみましょう。

f:id:tabemi:20210602125901p:plain
ログ


黄色い枠の間に4行あります。
これはソースコードの console.log() の数と同じです!

console.log(); はこのウィンドウに表示されるのです。

そしてウィンドウに表示されたものをログといいます

2-2.ログとプログラムを見比べる

では、1つ目のログに注目してみましょう。

//ちなみに半角スラッシュで、ソースコード上にプログラムに関係のない文字を書くことができます〇

console.log(values);

valuesの中には、シートの値のすべてが入っているのでした。

そして実際に1つ目のログにはシート上の値がすべて表示されています!

確認してみましょう!

f:id:tabemi:20210602114433p:plain
スプレッドシート上の値
f:id:tabemi:20210602125901p:plain
1つ目のログはシートの値のすべてが出力されている


ログ上に括弧が付いていますが、あまり気にせず行きましょう😊


2-3.対応関係を見極める

では、ほかの3つのログはどのように表示されていますか?
values の値の中身と そのほかの console.log(); の中身を見比べてみましょう。

console.log(values);
console.log(values[1][3]); 
console.log(values[1]); 
console.log(values[3][4]); 

//ログの結果
//  2次元配列のvalues の中身
//[ [ 'あ行', 'か行', 'さ行', 'た行', 'な行' ],
//   [ 'あ',    'か',     'さ',     'た',     'な' ],
//   [ 'い',    'き',     'し',     'ち',     'に' ],
//   [ 'う',    'く',     'す',     'つ',     'ぬ' ],
//   [ 'え',    'け',     'せ',     'て',     'ね' ],
//   [ 'お',    'こ',     'そ',     'と',     'の' ] ]

//  values[1][3]
// た

//  values[1]
// [ 'あ', 'か', 'さ', 'た', 'な' ]

//  values[3][4]
// ぬ

法則を見出してみましょう。

values[1][3] は た が出力される。
values[1] は [ 'あ', 'か', 'さ', 'た', 'な' ] が出力される。

values の2行目、4個目は た です。
values の2行目は、あ か さ た な です。

values[3][4] は ぬ が出力される。
さらに、
values の4行目、E列は ぬ です。


値は、
vlues[ valuesの行数+1][ values の列位置+1]
で取り出せるということです。

ゼロから数えて何行目の何列目にあるかを、values[?][?]で表せばよいのです!

さらに「行全体」は values[?] で表すことができます。


文字で書くとややこしいのでビジュアルで理解しましょう。

console.log(values);

//表にすると分かりやすいかもしれません。

//  2次元配列のvalues の中身

//                 0列目,  1列目,  2列目,  3列目,  4列目
// 0行目 [ [ 'あ行',  'か行',  'さ行',  'た行',  'な行' ], 
// 1行目   [ 'あ',     'か',      'さ',      'た',      'な' ],
// 2行目   [ 'い',     'き',      'し',      'ち',      'に' ],
// 3行目   [ 'う',     'く',      'す',      'つ',      'ぬ' ],
// 4行目   [ 'え',     'け',      'せ',      'て',      'ね' ],
// 5行目   [ 'お',     'こ',      'そ',      'と',      'の' ] ]

//0行目の3列目
// values[0][3]

//1行目
// values[1]
values 0列目 1列目 2列目 3列目 4列目
0行目 あ行 か行 さ行 た行 な行
1行目
2行目
3行目
4行目
5行目

3行目の2列目は
values[3][2]
で表される。





2-4.2次元配列の操作とは

それでは、話を2次元配列に戻します。

2次元配列の操作とは、これまで見てきた values[?][?] をもとに理解していきます。

2次元配列である values は、values[?][?]で特定の位置にアクセスができる

これが今回のもっとも重要な点です。


3.まとめ

「シートを編集とは2次元配列 values を操作すること」です。

今回分かったことは、

  • valuesは2次元配列という形で値を持っている
  • console.log(??); で値の中身を見ることができる。
  • values[?][?] で値の特定の場所を意味する
  • 0から数えて何行目の何列目にあるかを、values[?][?]で表せる

つまり2次元配列 values を操作するには values[?][?] を駆使する ということです!

さまざまシートの値を変更・[]の中の数字を変更して、確かめてみてください!



基本的な考え方

  1. シートの値を取る
  2. 値を編集する
  3. シートに値を戻す



同義


  1. シートから2次元配列で値を取得する
  2. 2次元配列を操作する
  3. 2次元配列をシートに戻す

最後に

少し専門的なお話になってきました。

しかし、すべての用語や使い方を覚える必要はないです。「そんなものかー」と悠長に構えることが大事です〇


不明点、相談等あれば、コメントください!!

少しでもお役に立てればと思います。


次回は、実際に2次元配列となったシートの値 values を編集していきます!

ではでは~



GASで自動化します 迅速なレスポンス/GASの業務委託経験あり

【GAS入門】感覚で分かる!第1回初めての Google Apps Script


どうも、たべみです。

今回から、Google Apps Script の初心者向けコースが始まります。

プログラミングってなに?という方でも、なんとなーーーく理解できるように解説していきます


とはいっても、最低限のプログラム(JavaScript)の知識が必要であります。
こちらの記事に分かりやすく解説されています。「数値と文字列の出力」から参考になると思います!
JS(JavaScript)の書き方基本 ~初心者向け~ - Qiita

あまり深読みせず、
見比べながら、進めていくと良いですよ!



さて、
このコースではスプレッドシートの操作の考え方が分かることを目的とします。

「考え方?スキルじゃなくて?」と思われた方、鋭いです。

考え方が分かれば、あとで応用が利きます
考え方を知ることが一番のスキルです!


やや強引かもしれませんが、
やっていきしょう。



1.基本的な考え方

このコースではスプレッドシートGoogle Apps Script (以下、GAS)で操作することを目標にします。
その際、もっとも基本となる考え方をご説明します。

基本の考え方

  1. シートの値を取る
  2. 値を編集する
  3. シートに値を戻す

以上になります。

ということで、スプレッドシートをGASで操作するときは、この3ステップを頭に叩き込んでおけばOKです。

今回の第一回は、その考え方の基礎となる、シートの値を取得する方法をお伝えします。

スプレッドシートをGASで操作する場合、もっとも初めに書くコードです。


間違いなく、そうです。いや、9割5分、、8割くらいはそうだと思います!


では、ようやっと見ていきます。


2.スプレッドシートからスクリプトエディタを開く

Googleスプレッドシートの画像
Googleスプレッドシート

GASを書く場所を開いていきます
とくに考えなくて大丈夫です。

「ああ、ここを開くのね。はいはい。」という気持ちです。


間違っても、「で?これはどういうことなの?」と突っ込んではいけないのです。


こちらです。
tabemi.hatenablog.com


3.シートの値を取得する

Google Apps Script エディタ画面
Google Apps Script スクリプトエディタ

では、実際にプログラムを書いていきましょう!

復習
基本の考え方

  1. シートの値を取る
  2. 値を編集する
  3. シートに値を戻す

3-1.シートの値を取得するプログラム

function myFunction() {
 
}

このように書いてあると思います。
これを下のように書いてみましょう。

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet(); 
  const sheet = ss.getSheets()[0];
  const values = sheet.getDataRange().getValues();
}

シートの値は、 values にすべて入っています。

const values = sheet.getDataRange().getValues(); 

※とは言っても、現在シートになにも書いていないので、values は空です。

  • const は「変数」varの代わりの文字です。
  • =(イコール)の左の処理結果が、右側に代入されます


左が右にです。
sheet.getDataRange().getValues(); の結果が、values に代入されている。
sheet.getDataRange().getValues(); はシートの値を取得する処理です。

。。。😢


「へーー」くらいで大丈夫です

3-2.簡潔に復習

シートの値が欲しいんじゃ!というときは、

function myFunction() {
 
}

の関数のなかに下の3行を書きます。

const ss = SpreadsheetApp.getActiveSpreadsheet(); 
const sheet = ss.getSheets()[0];
const values = sheet.getDataRange().getValues();


今後は、、

  1. values にシートの値が入っていて、
  2. values を編集して
  3. values をシートに戻す

ですね。

4.分からないときの大原則

ここまで、お疲れ様でした!!

すこし、マインドの部分で大事な部分をお伝えします。

Google Apps Script の学習に大事なこと

暗記不要。コピペして。
そして、調べる。

コピペでまかなえる部分は、それで、
分からないことは、調べてOK。

ゴールは自動化や使えるものを完成させることなので、脳みそにあるか否かはあまり関係がなかったりします。(キビシイ)

そうはいっても、いずれ自然とスキルとして身につきます。


つまりは、
最初は楽しくいきましょうということです!(雑)

最後に

ここまで、初めてGoogle Apps Script を触る方向けにシートの取得方法を確認しました。

実は、このコースを始めるきっかけが、
私自身、周りに教えきれなかった思い出があるからです。。


今度こそは、しっかりと伝えられるようにしていきますので、よろしくお願いいたします。

今回は、GASの考え方と、シートを取得するテンプレを学びました。
次回は、シートを編集して、シートを戻すことを学習していきます。

  1. シートの値を取る <=今回はこれ
  2. 値を編集する
  3. シートに値を戻す


ではでは~

【コピペ】Googleアナリティクスの日報をLINEに通知する方法

f:id:tabemi:20210531210053j:plain

どうも、たべみです。

今回は、サイトの分析ツールであるGoogleアナリティクスのデータを毎日LINEに通知する方法をご紹介します。

難しそう、、と思われるかもしれませんが、9割5分コピペで大丈夫なのでご安心ください。

目次

できるもの

公式LINEチャンネルから、Googleアナリティクスで計測された前日のデータが毎朝8時に送られます。なお、データが送られるのは1名のみとなります。

送られるデータは、ページごとの

  • ページビュー数
  • セッション数
  • 平均セッション時間
  • 離脱率

となります!

ページビュー数の上位10ページのみの送信となります!
また、Googleアカウントに紐づいているすべてのサイトのデータが送信されます。

例えば、1つのアカウントで、2つのサイトをモニタリングしていた場合、それぞれのサイトのページビュー数上位10ページのデータが送信されます


毎朝確認するには十分の指標ですね~

別途確認したい項目あれば、コメントしてください!


今回の作業概要

では、大まかに作業内容を確認します。

  1. 新しいスプレッドシートからエディタを開く
  2. コードをコピペする
  3. 公式LINEチャンネルとプログラムを紐づける

1.新しいスプレッドシートからエディタを開く

では、作業を開始していきます。
まずは、プログラムをコピペする場所を開いていきます!

こちらの記事に詳しく解説しているので、ご覧下さい。早ければ1分の作業です!
oiho.net

2.コードをコピペする


では、開いたスクリプトエディタにコードをコピぺしていきます。
コピペのほかに操作がありますので、お見逃しなく!

2-1.コードをコピペする

現在書いてあるコードをすべて削除してください!

削除)

function myFunction() {

}


下のコードをもれなくコピペしてください。

貼付)

const ACCESS_TOKEN = "【ここを削除】";

function init() {
  //毎日9時にレポートを出力する
  ScriptApp.newTrigger('main').timeBased().atHour(9).everyDays(1).create();
}

//最初にメッセージを送ったユーザーIDを取得する
function doPost(e) {
  //すでにuserIdが存在していれば何もしない
  if (PropertiesService.getScriptProperties().getProperty('to')) return ;
  const responseLine = e.postData.getDataAsString();

  const event = JSON.parse(responseLine).events[0];
  const userID = event.source.userId;
  PropertiesService.getScriptProperties().setProperty('to', userID);
  
}

function main() {
  const to = PropertiesService.getScriptProperties().getProperty('to');
  if(!to)return ;
  const lists = getLists();
  for (let i = 0; i < lists.length; i++) {
    const messages = createMessages(lists[i]);
    postLine(messages, to);
  }
}

//line にメッセージを送る
function postLine(messages, to) {
  const url = "https://api.line.me/v2/bot/message/push";
  const headers = {
    "Content-Type": "application/json; charset=UTF-8",
    'Authorization': 'Bearer ' + ACCESS_TOKEN,
  };
  
  
  const payload = { to , messages };
  const options = {
    "method": "post",
    headers,
    "payload": JSON.stringify(payload)
  };
  try{
    UrlFetchApp.fetch(url, options);
  }catch(e){
    console.log(e);
  }
}

// messageオブジェクトを作成する
function createMessages({ accountName, webPropertyName, profileName, report }) {
  const messageHeader = "Analytics Report\n\n" +accountName +"\n" +webPropertyName +"\n" +profileName +"\n\n";
  if (!report) return [{ "type": "text", "text": messageHeader +"データがありません" }];

  const header = ['ページビュー', 'セッション', '平均セッション時間', '離脱率'];
  const diplayText = report.reduce((text, r) => {
    const [path, title, ...indexes] = r;

    const t = indexes.reduce((indexesText, index, i) => {
      return indexesText + '\n\t' + header[i] + ': ' + index;
    }, `path: ${path}\n${title}`);
    return text + t + '\n\n';
  }, messageHeader);
  console.log(diplayText);
  return [{ "type": "text", "text": diplayText }];
}

/**
 * account内すべてのサイト情報を取得する
 * @return {array{}}
 */
function getLists() {
  const accounts = Analytics.Management.Accounts.list();
  if (!accounts.items || !accounts.items.length) return;
  const listReports = accounts.items.reduce((a, account) => {
    const accountId = account.id;
    const accountName = account.name;
    const webProperties = Analytics.Management.Webproperties.list(accountId);
    if (!webProperties.items || !webProperties.items.length) return a;
    const listProfiles = webProperties.items.reduce((b, webProperty) => {
      const webPropertyId = webProperty.id;
      const webPropertyName = webProperty.name;
      const profiles = Analytics.Management.Profiles.list(accountId, webPropertyId);
      if (!profiles.items || !profiles.items.length) return b;
      const reports = profiles.items.reduce((c, profile) => {
        const profileId = profile.id;
        const profileName = profile.name;
        const report = runReport(profileId);
        return [...c, { accountName, webPropertyName, profileName, report }];
      }, []);
      return [...b, ...reports];
    }, []);
    return [...a, ...listProfiles];
  }, []);

  console.log(listReports);
  return listReports;
} // const getWebproperty = (accountId) => {


//サイトのidからレポートを取得する
function runReport(id) {
  const tableId = 'ga:' + id;
  const today = new Date();
  const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);
  const date =  Utilities.formatDate(yesterday, Session.getScriptTimeZone(), 'yyyy-MM-dd');
  // const twodaysago = new Date(today.getTime() -2 *24 * 60 * 60 * 1000);
  // const startDate = Utilities.formatDate(yesterday, Session.getScriptTimeZone(), 'yyyy-MM-dd');
  // const endDate = Utilities.formatDate(yesterday, Session.getScriptTimeZone(), 'yyyy-MM-dd');
  const metric = 'ga:pageviews,ga:sessions,ga:avgSessionDuration,ga:bounceRate';
  const options = {
    'dimensions': 'ga:pagePath,ga:pageTitle',
    'sort': '-ga:pageviews',
    'max-results': 10
  };
  const report = Analytics.Data.Ga.get(tableId, date, date, metric, options);
  return report.rows;
}

コードのコピペは以上となります。
このページは開いたままにしておきましょう

2-2.拡張機能にアナリティクスを追加する

このGoogle Apps ScriptからGoogleアナリティクスのデータを簡単に取得できる拡張機能を追加します。

  1. エディタ左側の「サービス +」のプラスをクリック
  2. Google Analytics API」を選択
  3. 「追加」をクリック

Google Analytics APIですのでご注意ください!!

f:id:tabemi:20210531211819p:plain:w300
サービス欄の + をクリック
f:id:tabemi:20210531212358p:plain:w300
Google Analytics API を選択して追加

3.公式LINEチャンネルとプログラムを紐づける

では、公式LINEチャンネルとコピペしたプログラムを紐づけていきます。

大まかな流れはコチラです。

  1. 公式LINEチャンネルのアクセストークンを取得する
  2. コードにアクセストークンを設定する
  3. プログラムを実行する
  4. プログラムをデプロイする
  5. デプロイURLを公式LINEに設定する
  6. 公式LINEチャンネルと友達になる

3-1.公式LINEチャンネルのアクセストークンを取得する

公式LINEチャンネルのアクセストークンの取得方法はこちらの記事をご覧ください。早くて10分ほどで完了します
公式LINEチャンネルを持っていない!という方も、こちらをご覧ください

oiho.net

3-2.コードにアクセストークンを設定する

それでは、取得したアクセストークンをコードに設定していきます。これでプログラムから公式LINEチャンネルのBOTを使用することができるようになります

先ほどコードをコピペしたスクリプトエディタをご覧ください。
1行目に下の文字が羅列されています。

const ACCESS_TOKEN = "【ここを削除】";

このコードにアクセストークンを設定します。
ここでは分かりやすさのため、アクセストークンが 0123456789 であったと仮定して説明いたします!

まずは【ここを削除】を括弧も含めて削除しましょう。

const ACCESS_TOKEN = "";

ダブルクォーテーションが二つ残りました。ここに公式LINEチャンネルのアクセストークンを貼り付けてください。

貼り付け後

const ACCESS_TOKEN = "0123456789";

このようになると思います。
実際は、0123456789 の代わりに皆さんが取得した公式LINEチャンネルのアクセストークンが設定します!

Google Apps Script エディタ画面
実際のアクセストークンを貼り付けたときの画像。アクセストークンが長いため、2行になるかもしれません。

3-3.プログラムを実行する

先ほどコードをコピペしたエディタ画面の上部に注目してみましょう。再生ボタンのようなアイコンがあるかと思います。押してみましょう。

f:id:tabemi:20210523162409p:plain
実行ボタンをクリック

すると、、ウィンドウが出てきますね。。

f:id:tabemi:20210523162329p:plain
ウィンドウが出てくる。「権限を確認」をクリック。キャンセルは押しません。

これの処理方法は以下の記事にまとめてあります。とはいっても30秒ほどで完了するので気楽にいきましょう!!
選択肢にはすべてYESを選ぶという気持ちでOKですよ。
oiho.net


上の承認作業終了後、黄色く「実行完了」が出ていればOKです!

エディタ画面
出てくる表示は少し違います。

でない!という方は、もう一度▶ボタンを押してみましょう。

3-4.プログラムをデプロイする

次は、公式LINEチャンネルにてメッセージが送信された場合に、プログラムが起動するように設定をしていきます。

そのままエディタ画面を開いたままにして、今度は、
プログラムが公式LINEにメッセージを送るためのURLを発行します。

手順はこちらです。

  1. エディタ画面の右上、「デプロイ」をクリック
  2. 「新しいデプロイ」を選択
  3. 種類の選択の歯車アイコンをクリック
  4. ページ下方、アクセスできるユーザーを「全員」にする
  5. 「デプロイ」
  6. 「ウェブアプリ」の下にある「https://」で始まるURLをコピー

こちらのURLもアクセストークンと同様に、自分以外にむやみに公開しないようにしましょう!

エディタ画面
「デプロイ」>「新しいデプロイ」とクリックする
エディタ画面
歯車アイコンをクリックし、「ウェブアプリ」を選択
エディタ画面
一番下の「アクセスできるユーザー」を「全員」にして「デプロイ」
デプロイ画面
デプロイ完了後の画面。URLをコピーしておく。

3-5.デプロイURLを公式LINEに設定する

先ほど発行したURLを公式LINEに設定をして、メッセージが送信されるたびにプログラムが呼び出されるようにします。

先ほどアクセストークンを取得したページに移動します。
LINEの開発者向けのページであるコンソール

  1. 「Message API設定」の「Webhook URL」に発行したURLを設定します。
  2. Webhookの利用」をオンにします。

以上でメッセージ送信されるとプログラムが起動するようになりました!

Webhook設定後の画像
Webhook設定後

3-6.公式LINEチャンネルと友達になる

上で開いた「Message API設定」にQRコードがあるかと思います。

これをお手持ちのスマホで読み取り友達に追加しましょう!

そして、なにかメッセージを送信してください。
メッセージを送ることによって、あなたのみにアナリティクスの情報を送るように設定されます!

一番初めにメッセージを送ったアカウントにしかデータが送付されないのでご注意ください!!

ちなみに、メッセージに対する返信は何も設定していない場合、「メッセージありがとうございます。~~」と送信されます。この内容は特に今回の作成に関係ありません

最後に

以上で、LINEに毎朝8時にアナリティクスのデータが送信されます!
明日の朝が楽しみですね~


お役に立てていることを祈ります!!

ではでは~

【ゼロから分かる】公式LINEのアクセストーク取得方法

f:id:tabemi:20210531185829p:plain

どうも、たべみです。

今回は、LINEBOTを作る上で欠かせない、アクセストークンの取得方法について見ていきます。

公式LINEのホームに移動する

ここをクリックして、公式LINEアカウントマネージャーに移動しましょう。

アカウント持ってないよ!という方は、下のLINEの公式ページを参考にアカウントを作成してください。
www.linebiz.com

LINEアカウントマネージャーのホーム画面の画像
LINEアカウントマネージャーのホーム画面

応答モードをBotに変更する

プログラムでチャットが応答するモードBot)に変更しましょう。

  1. 画面上部の「応答モード:チャット」の部分をクリック
  2. 基本設定の応答モードを「Bot」に変更
  3. 詳細設定のWebhookを「オン」に変更

詳細設定の応答メッセージは「オン」でも可ですが、すべてのメッセージに反応するdefaultのメッセージ設定は削除しておきましょう。

LINEアカウントマネージャーのホーム画面の画像
ホーム画面より「応答モード」をクリック
f:id:tabemi:20210524112427p:plain
応答モードを「Bot」に変更
f:id:tabemi:20210524112433p:plain
Webhookを「オン」に変更。応答メッセージはオンでも可ですが、すべてのメッセージに反応するdefaultのメッセージは削除しておきましょう。

チャンネルのアクセストークンを取得する

実際にアクセストークンを取得する作業となります!あと少しですので頑張りましょう!!

ここをクリックし、LINEの開発者向けのページであるコンソールを開きましょう。

f:id:tabemi:20210524112355p:plain:w350
リンク遷移先の画面。設定したいチャンネルを選びましょう。


この画面からアクセストークというものを取得していきます。アクセストークンとは簡単に言って、外部から公式LINEにアクセスできる鍵のようなものです。
そのため、アクセストークンは基本的に自分以外の人間に公開しないように気を付けて取り扱ってください!

それではアクセストークンの取得方法です。

  1. Message API設定」をクリック
  2. 一番下までスクロールし「チャンネルアクセストークン(長期)」の「発行」ボタンをクリック
  3. 文字の羅列が表示されるのでコピーする
f:id:tabemi:20210524112339p:plain
チャンネルのホーム画面。Message API設定をクリック
f:id:tabemi:20210524112345p:plain
アクセストークンを発行する
f:id:tabemi:20210524112350p:plain
発行後の画面。紙のマークをクリックするとコピーができます。

最後に

以上がLINEのアクセストークンの取得方法でした。

ではでは~

Google Apps Scriptの「承認・警告」の解消法&ざっくり解説

f:id:tabemi:20210528152327p:plain
どうも、たべみです。

今日は、コードを実行する前の承認作業について解説します。

突然出てきても不安になった方、なんの警告なのか知りたい方向けの記事です。

とりあえず承認していく

はやく解決方法が知りたい!という方が多いと思いますので、先に警告を解消する方法を解説します。

作業手順

  1. 「権限を確認」をクリック
  2. Googleアカウントを選択
  3. 左下「詳細」>「 安全でないページに移動」をクリック
  4. 下にスクロール「許可」をクリック

途中ものものしい画面が出てきますが、大丈夫です。安心してください。

f:id:tabemi:20210523162329p:plain:w450
「権限を確認」をクリック
f:id:tabemi:20210523162340p:plain:w200
Googleアカウントを選択
f:id:tabemi:20210523162346p:plain:w350
詳細をクリック
f:id:tabemi:20210523162354p:plain:w350
焦りますが、「安全ではないページに移動」をクリック
f:id:tabemi:20210528145630p:plain:w350
許可をクリック


以上で、承認が完了し、コードが実行できるようになっています!
お疲れ様でした!


警告の意味

警告を解決ができたところで、わかる範囲で解説します。

警告とは結局何だったのか

これまで解説してきた承認作業とは「あなたに代わってプログラムが色々しようとしてるけど、大丈夫かい?」という許可をGoogleが確認してきている、と認識して大丈夫です。


許可されない場合、このプログラムは動きませんので承認しましょう。

基本的に一度承認すれば基本はOK

一度、承認するれば実行のたびに承認をする必要なないです。

ただし、新しく機能を追加した場合は、再び承認が求められます

例えば、初めはスプレッドシートの操作だけのプログラムであったが、あとからGoogleドライブの操作をするプログラムを追加した場合。このとき、再びGoogleドライブを操作する許可を求めてきます。



大余談

このサイトZeroScriptでコピペするコードについて、
なんじゃないなにか情報を抜き取るコードの?!

と不安に思われる方いるかもしれません。

大丈夫です笑

実は、以前私は本気で心配していたんですよね。ネット上に上がっているコードをコピペすることへの恐怖感がかんりありました。

だから何度でも言います。大丈夫です。

大いなる余談でした笑



最後に

今回は、Google Apps Script を実行すると出てくる警告の解決方法と、ざっくりとした解説を行いました。

初めはびっくりしますが、慣れてしまえば流れ作業です。

よい自動化ライフをスタートさせてくださいね。

ではでは~