pingコマンド - 相手と相通できるかどうかを確認

pingコマンドとは

pingは通信相手との疎通を確認するためのコマンドです。

通信相手のIPアドレスかドメイン名を指定して実行し、ネットワーク経路に異常がないかどうかを調べることができます。

よく使うオプションは以下の通りです。

オプション内容
-a名前解決を行い、結果にドメイン名を表示
-i TTLエコー要求パケットの有効期限(TTL)を指定
-l サイズエコー要求パケットのサイズをバイト単位で指定
-n 回数コマンドを1回実行したときに送信するエコー要求パケットの回数を指定
-tCtrl+Cを押すまで、エコー要求パケットを続けて送信

ping実行

pingコマンドを実行してみます。

まずは同一セグメント内にあるWindowsパソコンのIPアドレスを指定します。

[コンソール]

1
ping 10.200.241.47

[実行結果]

1
2
3
4
5
6
7
8
9
10
10.200.241.47 に ping を送信しています 32 バイトのデータ:
10.200.241.47 からの応答: バイト数 =32 時間 <1ms TTL=128
10.200.241.47 からの応答: バイト数 =32 時間 <1ms TTL=128
10.200.241.47 からの応答: バイト数 =32 時間 <1ms TTL=128
10.200.241.47 からの応答: バイト数 =32 時間 <1ms TTL=128

10.200.241.47 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 0ms、平均 = 0ms

問題なく疎通できました。

TTLと表示されているのはエコー応答パケットのもので、Windowsの場合128が表示されます。


次にルータを1つはさんだ先にあるLinuxサーバのIPアドレスに対してpingコマンドを実行してみます。

[コンソール]

1
ping 172.40.8.46

[実行結果]

1
2
3
4
5
6
7
8
9
10
172.40.8.46 に ping を送信しています 32 バイトのデータ:
172.40.8.46 からの応答: バイト数 =32 時間 =5ms TTL=63
172.40.8.46 からの応答: バイト数 =32 時間 =20ms TTL=63
172.40.8.46 からの応答: バイト数 =32 時間 =7ms TTL=63
172.40.8.46 からの応答: バイト数 =32 時間 <1ms TTL=63

172.40.8.46 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 20ms、平均 = 8ms

これも問題なく疎通できました。

macOSやLinuxの場合、TTLは64が表示されるのですが経由したルータの数が引かれて63となっています。

つまり、TTLの数字をみることで通信相手のOSと経由しているルーターの数がわかることになります。


参考までに疎通ができない場合は、下記のような結果が表示されます。

[到達できないケース]

1
2
3
4
5
6
7
8
192.168.0.1 に ping を送信しています 32 バイトのデータ:
192.168.0.26 からの応答: 宛先ホストに到達できません。
192.168.0.26 からの応答: 宛先ホストに到達できません。
192.168.0.26 からの応答: 宛先ホストに到達できません。
192.168.0.26 からの応答: 宛先ホストに到達できません。

192.168.0.1 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、

tracertコマンド - 経路上のルーターを表示

tracertコマンドとは

tracertは、コマンドを実行したパソコンから通信相手までの経路上にあるルーターを一覧表示するコマンドです。

経由するルーターが近い方から順番に表示されるため、相手にパケットが届くまでの経路が分かります。

通信相手にアクセスできない場合に、どのルーターに問題があるのかを調べる際に役立ちます。

ルーター情報

次のようなルーターの情報が表示されます。

  • TTL(有効期限) [1列目]
    TTLはTime To Liveの略で、パケットの有効期限を意味します。
    機器を1つ経由するごとに数字を1つ減らし、0になったらその時点で中継を止めます。
    パケットが永久に放浪する事態を回避するのが目的です。
  • 応答時間 [2~4列目]
    パソコンから各ルーターにICMPのエコー要求パケットを送ってからエコー応答パケットが返ってくるまでの応答時間です。
    応答時間の測定は、各ルーターごと3回ずつ実施されます。
    4秒以内に応答がない場合は、*が表示されます。
  • IPアドレスまたはドメイン名とIPアドレスのセット [5列目]
    4秒以内に応答がない場合は、「要求がタイムアウトしました」と表示されます。

tracert実行

試しにgoogleに対してtracertコマンドを実行してみます。

[コンソール]

1
tracert google.com

[実行結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
google.com [2404:6800:4004:813::200e] へのルートをトレースしています
経由するホップ数は最大 30 です:

1 2 ms 2 ms 2 ms 2400:4050:7c0:3a00:826a:efff:fe31:bd72
2 3 ms 3 ms 117 ms 2400:4050:7c0:3a00::fffe
3 * * * 要求がタイムアウトしました。
4 * * * 要求がタイムアウトしました。
5 6 ms 5 ms 5 ms 2001:380:a120:2e::1
6 8 ms 6 ms 6 ms 2001:4860:1:1::21f5
7 5 ms 7 ms 5 ms 2404:6800:8042::1
8 * * * 要求がタイムアウトしました。
9 6 ms 7 ms 7 ms 2001:4860:0:1::14b9
10 5 ms 5 ms 5 ms nrt20s17-in-x0e.1e100.net [2404:6800:4004:813::200e]

トレースを完了しました。

上記の例では問題なくパケットは目的のサーバに届いています。

経路の途中で「要求がタイムアウトしました。」と表示されており、応答のなかったルーターが3台あったことが分かります。

これはICMPを無効にしている機器の可能性がありますが、tracertコマンドではそのような機器が途中にあっても、処理を続けるため最終的には通信相手までの経路が分かります。

よく使うオプション

よく使うオプションは以下の通りです。

オプション内容
-dIPアドレスの名前解決を行わない。
-w ミリ秒タイムアウト時間をミリ秒で指定する。
-h ルータ数経由するルータの数を指定する。

tracertの動作

tracertコマンドが宛先までの経由を調べる仕組みは下記の通りです。

  1. tracertが実行されたらTTLを「1」に設定したエコー要求パケットを送信する。
    TTLを1つずつ増やしながら順にこれを規定回数繰り返すか、宛先からエコー応答パケットが届くまで届ける。
  2. ルーターは届いたパケットのTTLを1つ小さくする。
  3. ルーターはTTLが0のパケットを時間切れのパケットとして送信元に通知する。
  4. ルータによっては、応答しない設定になっていることもある。
  5. ルーターが応答を返さなくても、その後のルータが応答することもある。
  6. 宛先の機器にエコー要求パケットが届いたら、その機器はエコー応答パケットを返す。
  7. 時間超過パケットやエコー応答パケットが届くと、エコー要求パケットを送ってから届くまでにかかった時間とそのパケットの送信元を表示する。

ipconfigコマンド - リゾルバーキャッシュの表示と削除

DNSリゾルバーキャッシュとは

Windowsパソコンでは、IPアドレスFQDNのキャッシュを保持しています。

(FQDNとは、ホスト名とドメイン名を省略しないで表示したものです)

IPアドレスとFQDNのキャッシュとは、Windowsで管理しているIPアドレスとFQDNの対応表のことでDNSリゾルバーキャッシュと呼ばれます。

通信フロー

FQDNで指定された相手と通信する場合、次のようなフローになります。

  1. DNSリゾルバーキャッシュを参照し、FQDNに対応するIPアドレスがあるかどうかを確認する。
  2. 一致するFQDNがあれば、それに対応するIPアドレスを使って通信を開始する。
  3. 一致するFQDNがなければ、DNSサーバに問い合わせを行う。
  4. DNSサーバに問い合わせた名前解決の結果をWindowsシステムの内部に保持し、外部のDNSサーバへの問い合わせをなるべく減らす。

DNSリゾルバーキャッシュの保持時間

DNSリゾルバーキャッシュのデータの保持時間は、初期設定で1日となっています。

この時間を過ぎればキャッシュは破棄されます。

(OSを再起動した場合もキャッシュのデータはクリアされます)

DNSリゾルバーキャッシュの表示

FQDNで指定した相手と通信できない場合、DNSリゾルバーキャッシュのデータが古くなっている可能性があります。

その場合は、DNSリゾルバーキャッシュを表示してキャッシュの内容を確認してみましょう。

[コンソール]

1
ipconfig /displaydns

[実行結果(例)]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Windows IP 構成

gbc6.jp2.as.criteo.com
----------------------------------------
レコード名 . . . . . . . : gbc6.jp2.as.criteo.com
レコードの種類 . . . . . : 1
Time To Live . . . . . .: 14776
データの長さ . . . . . . : 4
セクション . . . . . . . : 回答
A (ホスト) レコード. . . : 116.213.22.169


レコード名 . . . . . . . : gbc6.jp2.as.criteo.com
レコードの種類 . . . . . : 1
Time To Live . . . . . .: 14776
データの長さ . . . . . . : 4
セクション . . . . . . . : 回答
A (ホスト) レコード. . . : 116.213.22.187


レコード名 . . . . . . . : gbc6.jp2.as.criteo.com
レコードの種類 . . . . . : 1
Time To Live . . . . . .: 14776
データの長さ . . . . . . : 4
セクション . . . . . . . : 回答
A (ホスト) レコード. . . : 116.213.22.192


レコード名 . . . . . . . : gbc6.jp2.as.criteo.com
レコードの種類 . . . . . : 1
Time To Live . . . . . .: 14776
データの長さ . . . . . . : 4
セクション . . . . . . . : 回答
A (ホスト) レコード. . . : 116.213.22.190


レコード名 . . . . . . . : gbc6.jp2.as.criteo.com
レコードの種類 . . . . . : 1
Time To Live . . . . . .: 14776
データの長さ . . . . . . : 4
セクション . . . . . . . : 回答
A (ホスト) レコード. . . : 116.213.22.184
(・・・途中略・・・)

DNSリゾルバーキャッシュの削除

IPアドレスとFQDNの対応付けが間違っている場合は、下記のコマンドでDNSリゾルバーキャッシュの削除を行うことができます。

[コンソール]

1
ipconfig /flushdns

[実行結果]

1
2
3
Windows IP 構成

DNS リゾルバー キャッシュは正常にフラッシュされました。

その後、FQDNでアクセスを行うとDNSサーバへの問い合わせが行われ、正しいIPアドレスを取得してキャッシュに保持されます。

これで正しく通信ができるようになるはずです😀

netstatコマンド - ポートごとの通信状況を表示

netstatは、コンピュータの通信状況を一覧表示するコマンドです。

接続ごとに下記の情報を表示することができます。

  • プロトコル
  • 自分のIPアドレスと通信に使っているポート
  • 通信相手の名前と使っているポート
  • 状態
    LISTENING(待ち受け状態)⇒ESTABLISHED(通信の確立)⇒ CLOSING(通信の終了手続き中)⇒ TIME_WAIT(タイムアウト待ち)⇒ CLOSED(通信の終了)⇒LISTENINGに戻る。

netstatコマンド実行

netstatをオプションなしで実行すると、何らかの通信が始まったTCPのポート(終了処理中を含む)を一覧表示します。

[コンソール]

1
netstat

実行例は以下の通りです。

[実行結果(例)]

1
2
3
4
5
6
7
8
9
10
11
12
13

アクティブな接続

プロトコル ローカル アドレス 外部アドレス 状態
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:49956 us:https CLOSE_WAIT
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:50412 tp-in-f188:5228 ESTABLISHED
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:51835 server-13-249-157-166:https ESTABLISHED
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:54850 [64:ff9b::14c7:7855]:https ESTABLISHED
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:54963 [64:ff9b::68f4:2a82]:https ESTABLISHED
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:58107 [64:ff9b::68f4:2ac1]:https ESTABLISHED
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:62041 lb-006:https ESTABLISHED
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:62847 tp-in-f188:5228 ESTABLISHED
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:63889 us:https ESTABLISHED

-aオプションを付けて実行すると、待ち受け状態(LISTENING)やUDPを含むすべてのポートを表示します。

[コンソール]

1
netstat -a

実行例は以下の通りです。

[実行結果(例)]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

アクティブな接続

プロトコル ローカル アドレス 外部アドレス 状態
TCP 0.0.0.0:135 LAPTOP-MC79IJF9:0 LISTENING
TCP 0.0.0.0:445 LAPTOP-MC79IJF9:0 LISTENING
TCP 0.0.0.0:4000 LAPTOP-MC79IJF9:0 LISTENING
TCP 0.0.0.0:5040 LAPTOP-MC79IJF9:0 LISTENING
TCP 0.0.0.0:7680 LAPTOP-MC79IJF9:0 LISTENING
TCP 0.0.0.0:49664 LAPTOP-MC79IJF9:0 LISTENING
TCP 0.0.0.0:49665 LAPTOP-MC79IJF9:0 LISTENING
TCP 0.0.0.0:49666 LAPTOP-MC79IJF9:0 LISTENING
TCP 0.0.0.0:49667 LAPTOP-MC79IJF9:0 LISTENING
TCP 0.0.0.0:49668 LAPTOP-MC79IJF9:0 LISTENING
TCP 0.0.0.0:49673 LAPTOP-MC79IJF9:0 LISTENING
TCP 127.0.0.1:27017 LAPTOP-MC79IJF9:0 LISTENING
TCP 192.168.42.172:139 LAPTOP-MC79IJF9:0 LISTENING
TCP [::]:135 LAPTOP-MC79IJF9:0 LISTENING
TCP [::]:445 LAPTOP-MC79IJF9:0 LISTENING
TCP [::]:4000 LAPTOP-MC79IJF9:0 LISTENING
TCP [::]:7680 LAPTOP-MC79IJF9:0 LISTENING
TCP [::]:49664 LAPTOP-MC79IJF9:0 LISTENING
TCP [::]:49665 LAPTOP-MC79IJF9:0 LISTENING
TCP [::]:49666 LAPTOP-MC79IJF9:0 LISTENING
TCP [::]:49667 LAPTOP-MC79IJF9:0 LISTENING
TCP [::]:49668 LAPTOP-MC79IJF9:0 LISTENING
TCP [::]:49673 LAPTOP-MC79IJF9:0 LISTENING
TCP [::1]:49669 LAPTOP-MC79IJF9:0 LISTENING
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:50412 tp-in-f188:5228 ESTABLISHED
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:51820 196:https CLOSE_WAIT
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:54850 [64:ff9b::14c7:7855]:https ESTABLISHED
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:58107 [64:ff9b::68f4:2ac1]:https ESTABLISHED
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:58440 us:https CLOSE_WAIT
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:62041 lb-006:https ESTABLISHED
TCP [240b:c020:4d0:32ae:1106:be43:8832:7dcf]:62847 tp-in-f188:5228 ESTABLISHED
(・・・略・・・)
UDP 0.0.0.0:1900 *:*
UDP 0.0.0.0:5050 *:*
UDP 0.0.0.0:5353 *:*
UDP 0.0.0.0:5353 *:*
UDP 0.0.0.0:5353 *:*
UDP 0.0.0.0:5353 *:*
UDP 0.0.0.0:5353 *:*
UDP 0.0.0.0:5355 *:*
UDP 0.0.0.0:6771 *:*
UDP 0.0.0.0:6771 *:*
UDP 0.0.0.0:25372 *:*
UDP 0.0.0.0:50001 *:*
UDP 0.0.0.0:59865 *:*
(・・・略・・・)

netstatのオプション

netstatコマンドのオプションを一覧にまとめます。

オプション内容
-a待ち受けしているポートを含むポートの状態を表示する。
-eイーサネットの統計情報を表示する。
-nコンピュータ名やプロトコルを使わず、IPアドレスとポート番号で表示する。
-rルーティングテーブルを表示する。
-p プロトコル名ソケットが属すプログラムのPIDとプロセス名を表示する。
-b通信するポートを作成したプロセスの実行ファイルを表示する。
(管理者権限が必要)

自分の端末でWebサーバやFTPサーバを立ち上げた時に、きちんとLISTENING(待ち受け状態)になっているかどうか確認するときに使えるコマンドかと思います。

LAN内の他の端末からアクセスする場合は、さらにファイアウォールの設定を確認する必要があります。

さらにさらにWANに公開する場合は、ルータやロードバランサーの設定、ネットワーク構成などいろいろと考える必要があります。

arpコマンド - IPアドレスとMACアドレスの情報を表示・管理

arpは、IPアドレスとMACアドレスの結びつきを管理するARPテーブルの表示や更新を行うコマンドです。

(arpは、IPアドレスからイーサネット環境で通信する際に必要なMACアドレスを調べるためのプロトコルです)

イーサネットに接続した機器が通信を開始するとき、データを渡す相手のMACアドレスを知るためにネットワーク上のすべての機器に対して問い合わせを行い、該当する機器がMACアドレスを応答します。

このとき、応答のあったIPアドレスとMACアドレスの対応を一時的に保存するのがARPテーブルになります。

ARPテーブル表示

ARPテーブルを表示するには、下記コマンドを実行します。

[コンソール]

1
arp -a

実行例は以下の通りです。

[実行結果(例)]

1
2
3
4
5
6
7
8
9
10
インターフェイス: 192.168.42.172 --- 0xd
インターネット アドレス 物理アドレス 種類
192.168.42.129 0a-e9-6c-3f-e5-0d 動的
192.168.42.255 ff-ff-ff-ff-ff-ff 静的
224.0.0.22 01-00-5e-00-00-26 静的
224.0.0.251 01-00-5e-00-00-eb 静的
224.0.0.252 01-00-5e-00-00-ac 静的
239.255.102.18 01-00-5e-7f-66-e2 静的
239.255.255.250 01-00-5e-7f-ff-0a 静的
255.255.255.255 ff-ff-ff-ff-ff-ff 静的

IPアドレスが「インターネット アドレス」、MACアドレスが「物理アドレス」と表示されます。

ARPテーブル更新

ネットワーク上の機器を入れ替えた直後は、ARPテーブルに古い機器のMACアドレスが記録されたままとなっています。

ARPテーブルの内容をいったんクリアしたい場合は、下記コマンドを実行します。

[コンソール]

1
arp -d

このコマンドは管理者権限のあるコンソールで実行する必要がありますのでご注意ください。

新しく接続した機器に接続できない場合は、おまじないとしてこのコマンドを実行するようにするといいかもしれません😀

Google Apps Script - ⑨GMailの操作(メール削除)

Gmailを長く使っていると、メールマガジンや広告メールなど削除対象でしかないメールがたくさん溜まっていきます。

今回はGASを使って、不要なメールを削除してみます。

メールの削除

メールを削除するにはmoveToTrash関数(7行目)を使います。

削除対象のメールはsearch関数(3行目)を使って検索を行い、検索対象となったメールだけを削除します。

[Google Apps Script]

1
2
3
4
5
6
7
8
9
// メイン関数
function main() {
var deleteThreads = GmailApp.search("検索ワード");

//検索条件に合致するメールをゴミ箱に移動
for (var i = 0; i < deleteThreads.length; i++) {
deleteThreads[i].moveToTrash();
}
}

トリガー機能を使って、このスクリプトを定期的に実行するようにすれば、いちいち手動でメールを削除することなく受信メールボックスがすっきりしますのでおススメです😊

Google Apps Script - ⑨GMailの操作(受信ボックスの検索)

GASを使って、Gmailの検索を行います。

受信ボックスの検索

受信ボックスの検索にはGmailApp.search()関数を使います。

“検索ワード”が含まれるメールのの送信元、送信先、日付、件名、本文を表示するスクリプトは次のようになります。

[Google Apps Script]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function main() {
var thds = GmailApp.search("検索ワード");
for (var i = 0; i < thds.length; i++) {
var thd = thds[i];
var msgs = thd.getMessages();
for (var j = 0; j < msgs.length; j++) {
var msg = msgs[j];
var from = msg.getFrom(); // 送信元
var to = msg.getTo(); // 送信先
var date = msg.getDate(); // 日付
var subject = msg.getSubject(); // 件名
var body = msg.getBody(); // 本文
Logger.log(from + " : " + to + " : " + date+ " : " + subject);
}
}

検索クエリー

検索に使用可能なクエリーは下記の通りです。

検索内容検索演算子
送信者で検索from:from: 太郎
受信者で検索to:to: 次郎
件名で検索subject:subject: 〇〇につきまして

上記以外の検索オプションは下記をご参照ください。

Gmail で使用できる検索演算子 - https://support.google.com/mail/answer/7190?hl=ja

Python - 独自関数にタイムアウトを設定

最近Pythonで実装しているあるバッチ処理が、正常終了にもエラーにもならずプロセスとして残ってしまっていることが分かりました。

無限ループしているわけではなく、サーバの状態異常のため特定のLinuxコマンドの実行結果が戻ってこないことが原因でした。

なんとかしたいと思い調査したところ、関数にタイムアウトを設定できるライブラリがありましたので試してみたいと思います。

ライブラリのインストール

タイムアウト処理を行うためのライブラリをインストールします。

[コンソール]

1
pip install wrapt-timeout-decorator

Python3.6以降でないとインストールできないようですので、ご注意ください。

サンプルソース

無限ループする関数を定義し、その関数にタイムアウトの設定を行います。

タイムアウトの設定は4行目のデコレータで行っています。

デコレータとはある関数を拡張する機能で、関数の開始前や終了後などに処理を付け加えることができる機能のことです。

[コンソール]

1
2
3
4
5
6
7
8
9
10
import wrapt_timeout_decorator

# デコレータでタイムアウトの秒数を設定
@wrapt_timeout_decorator.timeout(dec_timeout=30)
def func():
while True:
pass

if __name__ == '__main__':
func()

実行結果は以下の通りです。

[実行結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Traceback (most recent call last):
File "test.py", line 11, in <module>
func()
File "C:\Util\anaconda3\lib\site-packages\wrapt_timeout_decorator\wrapt_timeout_decorator.py", line 123, in wrapper
return wrapped_with_timeout(wrap_helper)
File "C:\Util\anaconda3\lib\site-packages\wrapt_timeout_decorator\wrapt_timeout_decorator.py", line 131, in wrapped_with_timeout
return wrapped_with_timeout_process(wrap_helper)
File "C:\Util\anaconda3\lib\site-packages\wrapt_timeout_decorator\wrapt_timeout_decorator.py", line 145, in wrapped_with_timeout_process
return timeout_wrapper()
File "C:\Util\anaconda3\lib\site-packages\wrapt_timeout_decorator\wrap_function_multiprocess.py", line 43, in __call__
self.cancel()
File "C:\Util\anaconda3\lib\site-packages\wrapt_timeout_decorator\wrap_function_multiprocess.py", line 51, in cancel
raise_exception(self.wrap_helper.timeout_exception, self.wrap_helper.exception_message)
File "C:\Util\anaconda3\lib\site-packages\wrapt_timeout_decorator\wrap_helper.py", line 178, in raise_exception
raise exception(exception_message)
TimeoutError: Function func timed out after 30.0 seconds

最終行に30秒タイムアウトが発生したことが表示されています。

デコレータを追加するだけで簡単にタイムアウトの設定ができるのはとても便利ですね。

Google Apps Script - ⑧GMailの操作(受信ボックスの取得)

GASを使って、Gmailの操作を行ってみます。

Gmailの管理要素

Gmailでは受信および送信ボックスを、ThreadMessageという要素で管理しています。

  • Thread
    返信等でつながった一連のメール。
  • Message
    Thread内にあるメール。

受信ボックスの取得

受信ボックスの取得を行います。

全てのメールの送信元、送信先、日付、件名、本文を表示するスクリプトは次のようになります。

[Google Apps Script]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function main() {
var thds = GmailApp.getInboxThreads();
for (var i = 0; i < thds.length; i++) {
var thd = thds[i];
var msgs = thd.getMessages();
for (var j = 0; j < msgs.length; j++) {
var msg = msgs[j];
var from = msg.getFrom(); // 送信元
var to = msg.getTo(); // 送信先
var date = msg.getDate(); // 日付
var subject = msg.getSubject(); // 件名
var body = msg.getBody(); // 本文
Logger.log(from + " : " + to + " : " + date+ " : " + subject);
}
}

  • 2行目
    全てのThreadを取得します。
  • 5行目
    Threadごとのメールを取得します。
  • 8~12行目
    各メールの送信元、送信先、日付、件名、本文を取得します。

Google Apps Script - ⑦GoogleSpreadSheetのデータ参照

GASを使って、GoogleSpreadSheetのデータ参照を行ってみます。

スプレッドシートのデータ構造

GoogleSpreadSheetは、3つのデータ構造に分けることができます。

  • SpreadSheet
    1つのスプレッドシート・ファイルのこと。
    複数のシートを持ちます。
  • Sheet
    SpreadSheet内にあるシートのこと。
  • Range
    Sheet内にあるマス目の集合のこと。

一般的な表形式と同じ概念なので理解しやすいかと思います。

データ参照

データ参照を行うソースは以下の通りです。

[Google Apps Script]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function main() {
var id="********************************************"; // スプレッドシートID
var spreadsheet = SpreadsheetApp.openById(id) // スプレッドシートを取得
var sheet = spreadsheet.getSheetByName("シート1") // シートを取得

// 1セルのデータ取得(上から2つ、左から2つめのデータ取得)
Logger.log(sheet.getRange(2,2).getValue());

// 複数セルのデータ取得(3行3列のデータ取得)
var data = sheet.getRange(1,1,3,3).getValues();
for (var i=0; i < 3; i++) { // 横ループ
for (var j=0; j < 3; j++) { // 縦ループ
Logger.log(i + " " + j + " " + data[i][j]);
}
}
}
  • 2行目
    操作するスプレッドシートのIDを設定します。
    スプレッドシートIDは、ブラウザでスプレッドシートを開いたときのURLの“spreadsheets/d/“の後ろから“/edit”の前の文字列です。
  • 7行目
    1つのセルのデータを取得します。
    getRange関数でセル位置を指定し、getValue()関数をデータを取得しています。
  • 10行目
    複数のセルデータを取得します。
    1行目から3行目、1列目から3列目のデータをgetValues()関数を使ってまとめて取得し、配列に格納しています。
    複数のデータを参照したい場合は、まとめて取得したほうが処理が高速になります。