【こう書く】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; });
上の抜粋部分では、sheets
をreduce
して、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なのか、コードを書いていて分からなくなることが多々あります。
変数名をindex0
やindex1
のようにすると良いのかもなと思っている。
以上!
まとめ
SpreadSheet
クラスのmoveActiveSheet
を使ってアクティブなシートの位置を変えるのが、シートソートの肝です。
これが分かればきっと応用も効くはず!
ではまた。
【GAS入門】感覚で分かる!第3回初めての Google Apps Script
どうも、たべみです。
今回は、GAS入門コースの第3回目です。
前回は、GASでスプレッドシートを扱う際の基本の3ステップのうち、
2つ目の「値を編集する」前段階として、値のアクセス方法についてお伝えしました。
基本の3ステップ
- シートの値を取る
- 値を編集する
- シートに値を戻す
今回は満を持して第2ステップである「値を編集する」を解説していきます。
前回の記事は、こちらです。
1.前回までの復習
現在スプレッドシートには、あ~な行のあいうえお表が作成してあり、プログラムで取得し、それを 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]); }
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列目に絵文字が追加されています!
//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]); // => あ行(´∀`)
確かに、右辺の結果が左辺に代入されたようです!
その他、一番初めの処理に続く処理でも同様です!
ログで見られる通り、あ行(´∀`) の後、 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ステップ
- シートの値を取る
- 値を編集する <= 今回はここまで
- シートに値を戻す
次回は、最後のステップである、「シートに値を戻す」方法についてお伝えしていきます!
今回はこの辺で失礼します!
ではでは~
【GAS入門】感覚で分かる!第2回初めての Google Apps Script
どうも、たべみです。
前回に引き続き、GASの入門コースです。
入門段階では、まずGASを書く上で重要な考え方を頭に入れます。
その考え方とは、以下の3ステップで自動化を行うということでした。
- シートの値を取る
- 値を編集する
- シートに値を戻す
そして今回は、2番目について解説していきます。
前回の記事はコチラ
tabemi.hatenablog.com
1.値を編集するために
では、全体の流れの2番目の「値を編集する」点についてご説明します。
1-2.前提
値を編集するには、プログラミングの知識が必要です!(オオウ)
逆に言えば、値を編集する以外はコピペで行けます。
そしてGASにおいて「値の編集」は2次元配列の操作を意味します。
つまり、GAS入門における必要知識は、「2次元配列の操作」です!
1-3.スプレッドシートにあいうえお表を書く
前回、スプレッドシートになんの数字も文字も入れていなかったので、画像のように「シート1」にあいうえお表を作成してみてください。
全部書くのは大変なので、「な行」までで大丈夫です。
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( ?? ); の中身を見るためコードを実行します。
※中身を見るためにはコードを実行する必要があります。
先ほどコードをコピペしたエディタ画面の上部に注目してみましょう。再生ボタンのようなアイコンがあるかと思います。押してみましょう。
すると、、ウィンドウが出てきますね。。
これの処理方法は以下の記事にまとめてあります。とはいっても30秒ほどで完了するので気楽にいきましょう!!
選択肢にはすべてYESを選ぶという気持ちでOKですよ。
tabemi.hatenablog.com
上の承認作業終了後、黄色く「実行完了」が出ていればOKです!
でない!という方、もう一度実行ボタンを押してみましょう。
2.値の様子を見る
これで、コードの実行ができました。
2-1.console.log() の行方
では、「実行完了」のウィンドウをよく見てみましょう。
黄色い枠の間に4行あります。
これはソースコードの console.log() の数と同じです!
console.log(); はこのウィンドウに表示されるのです。
そしてウィンドウに表示されたものをログといいます!
2-2.ログとプログラムを見比べる
では、1つ目のログに注目してみましょう。
//ちなみに半角スラッシュで、ソースコード上にプログラムに関係のない文字を書くことができます〇
console.log(values);
valuesの中には、シートの値のすべてが入っているのでした。
そして実際に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[?][?] を駆使する ということです!
さまざまシートの値を変更・[]の中の数字を変更して、確かめてみてください!
基本的な考え方
- シートの値を取る
- 値を編集する
- シートに値を戻す
↓
同義
↓
- シートから2次元配列で値を取得する
- 2次元配列を操作する
- 2次元配列をシートに戻す
最後に
少し専門的なお話になってきました。
しかし、すべての用語や使い方を覚える必要はないです。「そんなものかー」と悠長に構えることが大事です〇
不明点、相談等あれば、コメントください!!
少しでもお役に立てればと思います。
次回は、実際に2次元配列となったシートの値 values を編集していきます!
ではでは~
【GAS入門】感覚で分かる!第1回初めての Google Apps Script
どうも、たべみです。
今回から、Google Apps Script の初心者向けコースが始まります。
プログラミングってなに?という方でも、なんとなーーーく理解できるように解説していきます。
とはいっても、最低限のプログラム(JavaScript)の知識が必要であります。
こちらの記事に分かりやすく解説されています。「数値と文字列の出力」から参考になると思います!
JS(JavaScript)の書き方基本 ~初心者向け~ - Qiita
あまり深読みせず、
見比べながら、進めていくと良いですよ!
さて、
このコースではスプレッドシートの操作の考え方が分かることを目的とします。
「考え方?スキルじゃなくて?」と思われた方、鋭いです。
考え方が分かれば、あとで応用が利きます。
考え方を知ることが一番のスキルです!
やや強引かもしれませんが、
やっていきしょう。
1.基本的な考え方
このコースではスプレッドシートをGoogle Apps Script (以下、GAS)で操作することを目標にします。
その際、もっとも基本となる考え方をご説明します。
基本の考え方
- シートの値を取る
- 値を編集する
- シートに値を戻す
以上になります。
ということで、スプレッドシートをGASで操作するときは、この3ステップを頭に叩き込んでおけばOKです。
今回の第一回は、その考え方の基礎となる、シートの値を取得する方法をお伝えします。
スプレッドシートをGASで操作する場合、もっとも初めに書くコードです。
間違いなく、そうです。いや、9割5分、、8割くらいはそうだと思います!
では、ようやっと見ていきます。
2.スプレッドシートからスクリプトエディタを開く
GASを書く場所を開いていきます。
とくに考えなくて大丈夫です。
「ああ、ここを開くのね。はいはい。」という気持ちです。
間違っても、「で?これはどういうことなの?」と突っ込んではいけないのです。
こちらです。
tabemi.hatenablog.com
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();
今後は、、
- values にシートの値が入っていて、
- values を編集して
- values をシートに戻す
ですね。
4.分からないときの大原則
ここまで、お疲れ様でした!!
すこし、マインドの部分で大事な部分をお伝えします。
Google Apps Script の学習に大事なこと
暗記不要。コピペして。
そして、調べる。
コピペでまかなえる部分は、それで、
分からないことは、調べてOK。
ゴールは自動化や使えるものを完成させることなので、脳みそにあるか否かはあまり関係がなかったりします。(キビシイ)
そうはいっても、いずれ自然とスキルとして身につきます。
つまりは、
最初は楽しくいきましょうということです!(雑)
最後に
ここまで、初めてGoogle Apps Script を触る方向けにシートの取得方法を確認しました。
実は、このコースを始めるきっかけが、
私自身、周りに教えきれなかった思い出があるからです。。
今度こそは、しっかりと伝えられるようにしていきますので、よろしくお願いいたします。
今回は、GASの考え方と、シートを取得するテンプレを学びました。
次回は、シートを編集して、シートを戻すことを学習していきます。
- シートの値を取る <=今回はこれ
- 値を編集する
- シートに値を戻す
ではでは~
【コピペ】Googleアナリティクスの日報をLINEに通知する方法
どうも、たべみです。
今回は、サイトの分析ツールであるGoogleアナリティクスのデータを毎日LINEに通知する方法をご紹介します。
難しそう、、と思われるかもしれませんが、9割5分コピペで大丈夫なのでご安心ください。
目次
できるもの
公式LINEチャンネルから、Googleアナリティクスで計測された前日のデータが毎朝8時に送られます。なお、データが送られるのは1名のみとなります。
送られるデータは、ページごとの
- ページビュー数
- セッション数
- 平均セッション時間
- 離脱率
となります!
ページビュー数の上位10ページのみの送信となります!
また、Googleアカウントに紐づいているすべてのサイトのデータが送信されます。
例えば、1つのアカウントで、2つのサイトをモニタリングしていた場合、それぞれのサイトのページビュー数上位10ページのデータが送信されます。
毎朝確認するには十分の指標ですね~
別途確認したい項目あれば、コメントしてください!
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アナリティクスのデータを簡単に取得できる拡張機能を追加します。
- エディタ左側の「サービス +」のプラスをクリック
- 「Google Analytics API」を選択
- 「追加」をクリック
Google Analytics APIですのでご注意ください!!
3.公式LINEチャンネルとプログラムを紐づける
では、公式LINEチャンネルとコピペしたプログラムを紐づけていきます。
大まかな流れはコチラです。
3-2.コードにアクセストークンを設定する
それでは、取得したアクセストークンをコードに設定していきます。これでプログラムから公式LINEチャンネルのBOTを使用することができるようになります。
先ほどコードをコピペしたスクリプトエディタをご覧ください。
1行目に下の文字が羅列されています。
const ACCESS_TOKEN = "【ここを削除】";
このコードにアクセストークンを設定します。
ここでは分かりやすさのため、アクセストークンが 0123456789 であったと仮定して説明いたします!
まずは【ここを削除】を括弧も含めて削除しましょう。
const ACCESS_TOKEN = "";
ダブルクォーテーションが二つ残りました。ここに公式LINEチャンネルのアクセストークンを貼り付けてください。
貼り付け後
const ACCESS_TOKEN = "0123456789";
このようになると思います。
実際は、0123456789 の代わりに皆さんが取得した公式LINEチャンネルのアクセストークンが設定します!
3-3.プログラムを実行する
先ほどコードをコピペしたエディタ画面の上部に注目してみましょう。再生ボタンのようなアイコンがあるかと思います。押してみましょう。
すると、、ウィンドウが出てきますね。。
これの処理方法は以下の記事にまとめてあります。とはいっても30秒ほどで完了するので気楽にいきましょう!!
選択肢にはすべてYESを選ぶという気持ちでOKですよ。
oiho.net
上の承認作業終了後、黄色く「実行完了」が出ていればOKです!
でない!という方は、もう一度▶ボタンを押してみましょう。
3-4.プログラムをデプロイする
次は、公式LINEチャンネルにてメッセージが送信された場合に、プログラムが起動するように設定をしていきます。
そのままエディタ画面を開いたままにして、今度は、
プログラムが公式LINEにメッセージを送るためのURLを発行します。
手順はこちらです。
- エディタ画面の右上、「デプロイ」をクリック
- 「新しいデプロイ」を選択
- 種類の選択の歯車アイコンをクリック
- ページ下方、アクセスできるユーザーを「全員」にする
- 「デプロイ」
- 「ウェブアプリ」の下にある「https://」で始まるURLをコピー
こちらのURLもアクセストークンと同様に、自分以外にむやみに公開しないようにしましょう!
3-5.デプロイURLを公式LINEに設定する
先ほど発行したURLを公式LINEに設定をして、メッセージが送信されるたびにプログラムが呼び出されるようにします。
先ほどアクセストークンを取得したページに移動します。
LINEの開発者向けのページであるコンソール
- 「Message API設定」の「Webhook URL」に発行したURLを設定します。
- 「Webhookの利用」をオンにします。
以上でメッセージ送信されるとプログラムが起動するようになりました!
最後に
以上で、LINEに毎朝8時にアナリティクスのデータが送信されます!
明日の朝が楽しみですね~
お役に立てていることを祈ります!!
ではでは~
【ゼロから分かる】公式LINEのアクセストーク取得方法
どうも、たべみです。
今回は、LINEBOTを作る上で欠かせない、アクセストークンの取得方法について見ていきます。
公式LINEのホームに移動する
ここをクリックして、公式LINEアカウントマネージャーに移動しましょう。
アカウント持ってないよ!という方は、下のLINEの公式ページを参考にアカウントを作成してください。
www.linebiz.com
応答モードをBotに変更する
プログラムでチャットが応答するモード(Bot)に変更しましょう。
- 画面上部の「応答モード:チャット」の部分をクリック
- 基本設定の応答モードを「Bot」に変更
- 詳細設定のWebhookを「オン」に変更
詳細設定の応答メッセージは「オン」でも可ですが、すべてのメッセージに反応するdefaultのメッセージ設定は削除しておきましょう。
Google Apps Scriptの「承認・警告」の解消法&ざっくり解説
どうも、たべみです。
今日は、コードを実行する前の承認作業について解説します。
突然出てきても不安になった方、なんの警告なのか知りたい方向けの記事です。
とりあえず承認していく
はやく解決方法が知りたい!という方が多いと思いますので、先に警告を解消する方法を解説します。
作業手順
- 「権限を確認」をクリック
- Googleアカウントを選択
- 左下「詳細」>「 安全でないページに移動」をクリック
- 下にスクロール「許可」をクリック
途中ものものしい画面が出てきますが、大丈夫です。安心してください。
以上で、承認が完了し、コードが実行できるようになっています!
お疲れ様でした!
警告の意味
警告を解決ができたところで、わかる範囲で解説します。
警告とは結局何だったのか
これまで解説してきた承認作業とは「あなたに代わってプログラムが色々しようとしてるけど、大丈夫かい?」という許可をGoogleが確認してきている、と認識して大丈夫です。
許可されない場合、このプログラムは動きませんので承認しましょう。
基本的に一度承認すれば基本はOK
一度、承認するれば実行のたびに承認をする必要なないです。
ただし、新しく機能を追加した場合は、再び承認が求められます。
例えば、初めはスプレッドシートの操作だけのプログラムであったが、あとからGoogleドライブの操作をするプログラムを追加した場合。このとき、再びGoogleドライブを操作する許可を求めてきます。
大余談
このサイトZeroScriptでコピペするコードについて、
なんじゃないなにか情報を抜き取るコードの?!
と不安に思われる方いるかもしれません。
大丈夫です笑
実は、以前私は本気で心配していたんですよね。ネット上に上がっているコードをコピペすることへの恐怖感がかんりありました。
だから何度でも言います。大丈夫です。
大いなる余談でした笑
最後に
今回は、Google Apps Script を実行すると出てくる警告の解決方法と、ざっくりとした解説を行いました。
初めはびっくりしますが、慣れてしまえば流れ作業です。
よい自動化ライフをスタートさせてくださいね。
ではでは~