日常生活のちょっとしたところで楽をしたい。そのための道具としてプログラミングを習得したい。特に、Googleのサービスを頻繁に使っている人にはにアクセスしやすいGoogle Apps Scriptを題材として、少しずつプログラミングを覚えていこう、という趣旨です。Pythonに関する話題も時々入ります。
2014年9月30日火曜日
2014年9月5日金曜日
Python | Excelワークシートの範囲指定方法
Excelを操作するときに必ず必要となるのが、データ範囲の指定です。Excelワークシートからデータを取得するときも、逆にデータを書き込むときも、ワークシート上の場所を指定する必要があるからです。
---
myRange1 = xlSheet.Cells(4,1) #1つのセルを(row,column)形式で指定
myRange2 = xlSheet.Range("B5:C10") #データ範囲をExcel式で指定
myRange3 = xlSheet.Range(xlSheet.Cells(2,2),xlSheet.Cells(3,8)) #データ範囲を(row,column)形式で指定
---
---
myRange1 = xlSheet.Cells(4,1) #1つのセルを(row,column)形式で指定
myRange2 = xlSheet.Range("B5:C10") #データ範囲をExcel式で指定
myRange3 = xlSheet.Range(xlSheet.Cells(2,2),xlSheet.Cells(3,8)) #データ範囲を(row,column)形式で指定
---
Python | Excelで新しいワークシートを追加する
---以下スクリプト---
import win32com.client #
xlApp = win32com.client.Dispatch("Excel.Application")
xlApp.Visible = 1
xlApp.Workbooks.open(r"C:\test.xlsx")
xlSheet = xlApp.Workbooks(1).Sheets(1)
xlApp.Worksheets.Add()
---以上スクリプト---
import win32com.client #
xlApp = win32com.client.Dispatch("Excel.Application")
xlApp.Visible = 1
xlApp.Workbooks.open(r"C:\test.xlsx")
xlSheet = xlApp.Workbooks(1).Sheets(1)
xlApp.Worksheets.Add()
---以上スクリプト---
2014年9月2日火曜日
Python | Excelファイルの読み込み方法
Pythonを使ってExcelファイルを操作する方法です。
まずはファイルを読み込んで、指定のセルの値を表示してみます。
---以下スクリプト---
import win32com.client #
xlApp = win32com.client.Dispatch("Excel.Application")
xlApp.Visible = 1
xlApp.Workbooks.open(r"C:\test.xlsx")
xlSheet = xlApp.Workbooks(1).Sheets(1)
xlCell = xlSheet.Cells(7, 3)
value = xlCell.value
xlApp.Quit()
print "Cell(7,3)->", value
---以上スクリプト---
まず、Excelを使うのにwin32comとExcelがインストールされている必要があります。
Python用Windows extensionダウンロードサイト
http://sourceforge.net/projects/pywin32/
その上でimportして使います。
上の例では読み込んだExcelファイルのワークシート1にあるセルC7の値を取得して表示します。
xlCell = xlSheet.Cells(7, 3)ではセル位置を(row, column)で指定するため、
(7, 3) = C7
となります。
まずはファイルを読み込んで、指定のセルの値を表示してみます。
---以下スクリプト---
import win32com.client #
xlApp = win32com.client.Dispatch("Excel.Application")
xlApp.Visible = 1
xlApp.Workbooks.open(r"C:\test.xlsx")
xlSheet = xlApp.Workbooks(1).Sheets(1)
xlCell = xlSheet.Cells(7, 3)
value = xlCell.value
xlApp.Quit()
print "Cell(7,3)->", value
---以上スクリプト---
まず、Excelを使うのにwin32comとExcelがインストールされている必要があります。
Python用Windows extensionダウンロードサイト
http://sourceforge.net/projects/pywin32/
その上でimportして使います。
上の例では読み込んだExcelファイルのワークシート1にあるセルC7の値を取得して表示します。
xlCell = xlSheet.Cells(7, 3)ではセル位置を(row, column)で指定するため、
(7, 3) = C7
となります。
2014年8月31日日曜日
Google Apps Script | 削除済みスプレッドシートのスクリプトの挙動
トリガーを設定したGoogle Apps Scriptを適用したスプレッドシートを削除した場合、スクリプトは起動しなくなるのでしょうか?
答えはNo。
つまり、削除後もスクリプトは起動し続けます。
Google SpreadsheetをDriveから削除すると、Sheetはゴミ箱に移動します。
この状態ではスクリプトは動き続けますので、止めるにはSheetをゴミ箱から完全に削除します。
つまり、削除後もスクリプトは起動し続けます。
Google SpreadsheetをDriveから削除すると、Sheetはゴミ箱に移動します。
この状態ではスクリプトは動き続けますので、止めるにはSheetをゴミ箱から完全に削除します。
ラベル:
Google Apps Script
2014年8月27日水曜日
2014年8月11日月曜日
Google Apps Script | メールにファイルを添付して送付する
メールだけを送るときのGoogle Apps Scriptの書き方は以前の投稿に書きました。
今回はさらにメールにファイルを添付して送信する場合の書き方です。
---以下スクリプト---
var file1 = {
fileName: "chart1",
mimeType: blob1.getContentType(),
content: blob1.getBytes()
};
var file2 = {
fileName: "chart2",
mimeType: blob2.getContentType(),
content: blob2.getBytes()
};
GmailApp.sendEmail(mailTo,subject,mailBody,{attachments: [file1,file2]});
---以上スクリプト---
と、このような形式になるのですが、これでは不完全です。blob1やblob2って何?となります。これについては別途。。。
今回はさらにメールにファイルを添付して送信する場合の書き方です。
---以下スクリプト---
var mailTo = "___@gmail.com"; //メール送信先アドレス
var mailSubject = "Test"; // メールのタイトルvar mailBody = "これはテストです。"; // メール本文var file1 = {
fileName: "chart1",
mimeType: blob1.getContentType(),
content: blob1.getBytes()
};
var file2 = {
fileName: "chart2",
mimeType: blob2.getContentType(),
content: blob2.getBytes()
};
GmailApp.sendEmail(mailTo,subject,mailBody,{attachments: [file1,file2]});
---以上スクリプト---
と、このような形式になるのですが、これでは不完全です。blob1やblob2って何?となります。これについては別途。。。
ラベル:
GmailAppクラス,
sendEmail()
Google Apps Script | メールを送る
GmailApp.sendEmail(mailTo,mailSubject,mailBody);
ここで、mailTo, mailSubject, mailBodyは変数です。
あらかじめ
var mailTo = "___@gmail.com"; // メール送信先アドレス
var mailSubject = "Test"; // メールのタイトル
var mailBody = "これはテストです。"; // メール本文
などと指定しておきます。
Google Apps Scriptリファレンス
ここで、mailTo, mailSubject, mailBodyは変数です。
あらかじめ
var mailTo = "___@gmail.com"; // メール送信先アドレス
var mailSubject = "Test"; // メールのタイトル
var mailBody = "これはテストです。"; // メール本文
などと指定しておきます。
Google Apps Scriptリファレンス
ラベル:
GmailAppクラス,
sendEmail()
2014年8月10日日曜日
Google Ads | Bloggerの場合のAdsenseの始め方5
Google AdSenseを適用するサイトが承認されると、Google AdSenseオンライン利用規約への同意を求められます。
下のほうで同意するかどうかを尋ねられています。
利用規約そのものはこちらで確認できます。
下のほうで同意するかどうかを尋ねられています。
利用規約そのものはこちらで確認できます。
ラベル:
Blogger,
Google AdSense
Google Ads | Bloggerの場合のAdsenseの始め方4
AdSenseアカウントと収益支払い(受取り)に必要な項目を入力します。
住所は町名や番地を先に入力し、市区町村が後に入力するようになっています。日本式とは逆なので注意します。
訂正します。
国または地域として日本を選択すると、タイムゾーンと支払い受取人の入力欄は日本式に自動的に変更されます。
申し込みの送信が完了すると画面が切り替わります。
とりあえずこれでAdSense登録申請は終了です。この後審査があり、受理/却下の連絡が1週間以内にあります。
続く→Bloggerの場合のAdsenseの始め方5
- 国,地域
- タイムゾーン
- アカウントの種類(個人またはビジネス)
次に、収益受取り人の情報を入力します。
- 名前
- 住所
- 電話番号
国または地域として日本を選択すると、タイムゾーンと支払い受取人の入力欄は日本式に自動的に変更されます。
申し込みの送信が完了すると画面が切り替わります。
とりあえずこれでAdSense登録申請は終了です。この後審査があり、受理/却下の連絡が1週間以内にあります。
続く→Bloggerの場合のAdsenseの始め方5
ラベル:
Blogger,
Google AdSense
Google Ads | Bloggerの場合のAdsenseの始め方3
ここでは広告の掲載先サイトURLを確認します。Bloggerの管理ページから手順に従って進んでくると、Bloggerで作成したブログのURLが自動的に表示されます。
次に、ブログで使っている主な言語を選択し、『続行』をクリックします。
続く→Bloggerの場合のAdsenseの始め方4
ラベル:
Blogger,
Google AdSense
2014年8月8日金曜日
Google Ads | Bloggerの場合のAdsenseの始め方2
Bloggerの管理ページで『収益』をクリックすると、左のような画面に遷移しますので、左下の『AdSenseに登録』ボタンをクリックします。
なお、ブログ開設後6ヶ月以上が経過していないと登録できませんので注意が必要です。他の条件についても下のリンク先に記載されていますので、事前に確認しておきましょう。
Google AdSenseへの参加要件
続く→Bloggerの場合のAdsenseの始め方3
なお、ブログ開設後6ヶ月以上が経過していないと登録できませんので注意が必要です。他の条件についても下のリンク先に記載されていますので、事前に確認しておきましょう。
Google AdSenseへの参加要件
続く→Bloggerの場合のAdsenseの始め方3
ラベル:
Blogger,
Google AdSense
2014年7月28日月曜日
Google Ads | Bloggerの場合のAdsenseの始め方1
Google AdSenseは、サイトの管理権限を持っていればどのようなサイトにも適用できるサービスですが、Googleのサービスに対して適用する場合は手続き方法が少し異なります。
ここではBloggerの場合について書きます。
ラベル:
Google AdSense
2014年7月27日日曜日
2014年7月25日金曜日
Google Form | フォームの概要表示機能
Googleが提供するサービスの1つに、フォームがあります。これを使うと、オンラインのアンケートなどを簡単に作成することができます。
アンケートの結果は集計して分析しないと意味がありませんが、集計作業は大変です。Google Apps Scriptを使えば任意に集計できますが、スクリプトを書くにも時間はかかります。
そこで、フォームの『回答の概要を表示』する機能を使うと、集計結果を見ることができます。フォームの回答が保存されているスプレッドシートを開き、メニュバーからフォーム > 回答の概要を表示を選択します。
これは私がフォームを使って記録している植物の生育環境データです。このような形式で概要を見ることができます。
天気はリスト(晴れ,曇り,雨,雪)から選択、水やりと肥料やりはラジオボタンでの選択形式としているので、その結果は円グラフで表示されるようです。
アンケートの結果は集計して分析しないと意味がありませんが、集計作業は大変です。Google Apps Scriptを使えば任意に集計できますが、スクリプトを書くにも時間はかかります。
そこで、フォームの『回答の概要を表示』する機能を使うと、集計結果を見ることができます。フォームの回答が保存されているスプレッドシートを開き、メニュバーからフォーム > 回答の概要を表示を選択します。
これは私がフォームを使って記録している植物の生育環境データです。このような形式で概要を見ることができます。
天気はリスト(晴れ,曇り,雨,雪)から選択、水やりと肥料やりはラジオボタンでの選択形式としているので、その結果は円グラフで表示されるようです。
ラベル:
Google Form
2014年7月24日木曜日
2014年7月2日水曜日
Google Apps Script : 指定範囲内の整数からランダムに1つ選ぶ方法
使う機会が多いか少ないかはわかりませんが、今作っているツール(こちらで作成を始めたツールとほぼ同じ機能をもの)に自分の意図とは関係なく、無作為にデータを選んで表示させたい部分があったので、Google Apps Scriptではどのような書き方するのか調べてみました。
結果は、JavaScriptの関数を使う、です。
JavaScriptのMathクラスのrandom()関数を使うと、0以上1未満の小数を得られます。これを使って指定範囲内の整数をランダムに1つ得るには、指定の範囲を0~99とすると
var random = Math.floor(Math.random() * 100);
となります。random()で得られるのは0以上1未満の小数なので、100をかけることで0以上100未満の小数が得られます。
floor()は小数点以下の切り捨てるときに使いますので、0以上100未満の小数の小数点以下を切り捨てることで、0~99までの100個の整数を無作為に得ることができます。
参考にさせていただいたサイトはこちら
結果は、JavaScriptの関数を使う、です。
JavaScriptのMathクラスのrandom()関数を使うと、0以上1未満の小数を得られます。これを使って指定範囲内の整数をランダムに1つ得るには、指定の範囲を0~99とすると
var random = Math.floor(Math.random() * 100);
となります。random()で得られるのは0以上1未満の小数なので、100をかけることで0以上100未満の小数が得られます。
floor()は小数点以下の切り捨てるときに使いますので、0以上100未満の小数の小数点以下を切り捨てることで、0~99までの100個の整数を無作為に得ることができます。
参考にさせていただいたサイトはこちら
ラベル:
floor(),
Google Apps Script,
JavaScript,
Math,
random()
2014年7月1日火曜日
Google Apps Script : 過去のメルマガを再配信するツールを作る1
今回は、Google Apps Scriptを使って過去のメールマガジンの再配信ツールを作ってみたいと思います。
皆さんの中にも様々なメルマガを購読されている方がいらっしゃると思います。
私の場合、Amazonや楽天などのネットショップからのものが多く、それらは相当気になるタイトルでない限り、開くことなくゴミ箱行きです。
しかし、自己啓発目的のメルマガの中には、時間をあけて何度も読み返すと、その度に新たな発見がある有用なものもあります。
そこで、過去に配信されたメルマガを自分宛てに再配信するツールを作れば、何度も読み返すのが楽になり、その度に自分のことを考え直すきっかけにできるのではないでしょうか。
ツールを新たに作るに当たり、何をする必要があるかをまず考えます。
この、作りたいものを考えること、それを実現させる方法を考えることが、私のようなプログラミング初心者にはとても難しく感じます。プログラミングやシステム開発を専門的に教わる中には、このような悩みを解決する方法なども含まれていると思うのですが、自己流でも色々と調べたり、わからないなりにプログラムを書いてみることで、少しずつでも上達していけると考えています。
さて、今回作ろうとしているツールの目的は、
「過去に自分のGmailアドレス宛に配信されたメルマガを自分宛てに再配信する」
です。この目的を実現するのに必要だと考えられることを、とりあえず列挙してみますと、
次からは上に挙げたことをどのように実現させるかを、順番に見ていきたいと思います。
皆さんの中にも様々なメルマガを購読されている方がいらっしゃると思います。
私の場合、Amazonや楽天などのネットショップからのものが多く、それらは相当気になるタイトルでない限り、開くことなくゴミ箱行きです。
しかし、自己啓発目的のメルマガの中には、時間をあけて何度も読み返すと、その度に新たな発見がある有用なものもあります。
そこで、過去に配信されたメルマガを自分宛てに再配信するツールを作れば、何度も読み返すのが楽になり、その度に自分のことを考え直すきっかけにできるのではないでしょうか。
ツールを新たに作るに当たり、何をする必要があるかをまず考えます。
この、作りたいものを考えること、それを実現させる方法を考えることが、私のようなプログラミング初心者にはとても難しく感じます。プログラミングやシステム開発を専門的に教わる中には、このような悩みを解決する方法なども含まれていると思うのですが、自己流でも色々と調べたり、わからないなりにプログラムを書いてみることで、少しずつでも上達していけると考えています。
さて、今回作ろうとしているツールの目的は、
「過去に自分のGmailアドレス宛に配信されたメルマガを自分宛てに再配信する」
です。この目的を実現するのに必要だと考えられることを、とりあえず列挙してみますと、
- Gmail受信トレイにあるメルマガの内容を取得する
- 取得したメルマガの内容を保存する
- 保存したメルマガの内容を指定したメールアドレス宛てに送る
次からは上に挙げたことをどのように実現させるかを、順番に見ていきたいと思います。
2014年6月26日木曜日
Google Spreadsheet : ゴールシーク機能とソルバ機能について
Googleのサービスは便利なものも多いですが、無料で使える代償として、Googleの都合に振り回されることもあります。バージョンアップに伴う機能の改廃がその1つです。
以前のGoogle Spreadsheetでは、線形問題限定ではあったものの、ソルバ機能がついていました。しかし、今は廃止されています。ゴールシーク(Goal Seek)やソルバ(Solver)は、使い方次第では様々なことができます。 Microsoft Excelのソルバ機能を使った数学計算、工学応用例については、
以前のGoogle Spreadsheetでは、線形問題限定ではあったものの、ソルバ機能がついていました。しかし、今は廃止されています。ゴールシーク(Goal Seek)やソルバ(Solver)は、使い方次第では様々なことができます。 Microsoft Excelのソルバ機能を使った数学計算、工学応用例については、
が詳しいです。
同様のことがGoogle SpreadsheetやGoogle Apps Scriptを使って実現できたら、おもしろいだろうな、と思っています。
ということで、ゴールシーク機能をGoogle Apps Scriptで実現できるかどうか、トライしてみたいと思います。
ラベル:
Goal Seek,
Solver,
Spreadsheet
Google Apps Script : セルから取得した値を四捨五入する
Google Spreadsheetのセルから取得した値を整数に変換する方法はJavaScriptの関数を使う方法がいくつかあるようなのですが、ここでは四捨五入して整数にするとします。その場合の記述方法は、
var 変数名 = Math.round(sheet.getRange(セル指定).getValue());
こちらに値の切上げや切り下げを含む他の方法での整数への変換方法が記載されています。
var 変数名 = Math.round(sheet.getRange(セル指定).getValue());
こちらに値の切上げや切り下げを含む他の方法での整数への変換方法が記載されています。
ラベル:
Google Apps Script,
JavaScript,
Math,
round()
2014年6月24日火曜日
Google Apps Script : 特定の列内の複数の値を並び替える
もちろん列ではなく行の場合でも同じ方法で値を並び替えた配列を取得できます。
書き方は、
配列名.sort();
下のサイトで教えていただきました。ありがとうございます。
配列を逆順(降順)にソートする(JavaScript)
書き方は、
配列名.sort();
下のサイトで教えていただきました。ありがとうございます。
配列を逆順(降順)にソートする(JavaScript)
ラベル:
Google Apps Script,
JavaScript,
sort()
Google Apps Script : 特定の列内の最大値を取得する
とりあえず書き方だけ。
D列の1行目から最終行までの値を1つの配列に入れ、その配列内の最大値をJavaScriptのメソッドを使って取得するようです。
---以下スクリプト---
function getMaxValue() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var last_row = sheet.getLastRow();
var columnD = sheet.getRange(1,4,last_row);
var valuesD = columnD.getValues(); //D列の値が入った配列
Browser.msgBox(Math.max.apply(null,valuesD));
}
---以上スクリプト---
下のサイトから頂戴しました。ありがとうございます。
ラベル:
apply(),
Google Apps Script,
JavaScript,
Math,
max()
2014年6月20日金曜日
Google Apps Script : 配列の最初から最後までループを回すときの注意点
Google Apps Scriptを使って、自分のGmail受信トレイから特定のラベルを付けたメールの内容をGoogle Spreadsheetに入力するスクリプトを書いていてはまってしまったので、ここに書いておきます。
まず、はまったスクリプトがこちら。
---以下スクリプト---
function getMessageFromGmail() {
var label = GmailApp.getUserLabelByName("Label name");
var threads = label.getThreads();
row = 1;
for(var n=0;n<=threads.length;n++) {
var thread = threads[n];
var msgs = thread.getMessages();
for(m in msgs) {
var msg = msgs[m];
var date = msg.getDate();
var from = msg.getFrom();
var to = msg.getTo();
var subject = msgs[m].getSubject();
var body = msgs[m].getPlainBody();
sheet.getRange(row,1).setValue(date);
sheet.getRange(row,2).setValue(subject);
sheet.getRange(row,3).setValue(body);
row = row + 1;
}
}
}
---以上スクリプト---
次に、問題が解決したスクリプトがこちら。
---以下スクリプト---
function getMessageFromGmail() {
var label = GmailApp.getUserLabelByName("Label name");
var threads = label.getThreads();
row = 1;
for(var n=0;n<threads.length;n++) {
var thread = threads[n];
var msgs = thread.getMessages();
for(m in msgs) {
var msg = msgs[m];
var date = msg.getDate();
var from = msg.getFrom();
var to = msg.getTo();
var subject = msgs[m].getSubject();
var body = msgs[m].getPlainBody();
sheet.getRange(row,1).setValue(date);
sheet.getRange(row,2).setValue(subject);
sheet.getRange(row,3).setValue(body);
row = row + 1;
}
}
}
---以上スクリプト---
違いは1箇所。1つめのforループを回す回数を示すn<threads.lengthが、<=か<だけです。基本を分かっている人にはバカにされ笑われてしまいそうですが、独学だとこんなところにはまってしまいます。
このスクリプトでは、まず、
var label = GmailApp.getUserLabelByName("Label name");
var threads = label.getThreads();
のところでGmailの受信トレイから"Label name"という名前のラベルの付いたスレッド(配列)を取得して、threadsという名前をつけています。
次に、配列threadsの中身をforループを使って順番に見ていき、n番目のスレッドを
var thread = thread[n]
var msgs = thread.getMessages();
としてthreadという名前の変数に入れ、thread(これも配列)の中身をgetMessages()メソッドを使って取りだしてmsgsという名前をつけています。
上の失敗例を実行すると、関数実行中のメッセージがなかなか消えず、消えたと思ったらvar msgs = thread.getMessages();のところでmessagesがgetできないというエラーメッセージが表示されます。
エラーの理由は、上にも書いた通り、forループの繰り返し回数指定にありました。
Google Apps Script (JavaScriptやPythonでも同様)では、配列(Pythonではリスト)のインデックスは0から始まるため、上のスクリプトのように配列の長さをループの繰り返し回数に指定する場合、
for(var n=0;n<=threads.length;n++)
と書くと、配列の長さより1回分多くループを回してしまうことになります。そのため、配列内の長さを超えたところでgetMessages()メソッドを実行使用してエラーとなっていました。
ものすごく単純なことなのですが、先駆者のみなさんのスクリプトのコピペで勉強を始めた身としては、引っかかって良かったと思える失敗でした。
まず、はまったスクリプトがこちら。
---以下スクリプト---
function getMessageFromGmail() {
var label = GmailApp.getUserLabelByName("Label name");
var threads = label.getThreads();
row = 1;
for(var n=0;n<=threads.length;n++) {
var thread = threads[n];
var msgs = thread.getMessages();
for(m in msgs) {
var msg = msgs[m];
var date = msg.getDate();
var from = msg.getFrom();
var to = msg.getTo();
var subject = msgs[m].getSubject();
var body = msgs[m].getPlainBody();
sheet.getRange(row,1).setValue(date);
sheet.getRange(row,2).setValue(subject);
sheet.getRange(row,3).setValue(body);
row = row + 1;
}
}
}
---以上スクリプト---
次に、問題が解決したスクリプトがこちら。
---以下スクリプト---
function getMessageFromGmail() {
var label = GmailApp.getUserLabelByName("Label name");
var threads = label.getThreads();
row = 1;
for(var n=0;n<threads.length;n++) {
var thread = threads[n];
var msgs = thread.getMessages();
for(m in msgs) {
var msg = msgs[m];
var date = msg.getDate();
var from = msg.getFrom();
var to = msg.getTo();
var subject = msgs[m].getSubject();
var body = msgs[m].getPlainBody();
sheet.getRange(row,1).setValue(date);
sheet.getRange(row,2).setValue(subject);
sheet.getRange(row,3).setValue(body);
row = row + 1;
}
}
}
---以上スクリプト---
違いは1箇所。1つめのforループを回す回数を示すn<threads.lengthが、<=か<だけです。基本を分かっている人にはバカにされ笑われてしまいそうですが、独学だとこんなところにはまってしまいます。
このスクリプトでは、まず、
var label = GmailApp.getUserLabelByName("Label name");
var threads = label.getThreads();
のところでGmailの受信トレイから"Label name"という名前のラベルの付いたスレッド(配列)を取得して、threadsという名前をつけています。
次に、配列threadsの中身をforループを使って順番に見ていき、n番目のスレッドを
var thread = thread[n]
var msgs = thread.getMessages();
としてthreadという名前の変数に入れ、thread(これも配列)の中身をgetMessages()メソッドを使って取りだしてmsgsという名前をつけています。
上の失敗例を実行すると、関数実行中のメッセージがなかなか消えず、消えたと思ったらvar msgs = thread.getMessages();のところでmessagesがgetできないというエラーメッセージが表示されます。
エラーの理由は、上にも書いた通り、forループの繰り返し回数指定にありました。
Google Apps Script (JavaScriptやPythonでも同様)では、配列(Pythonではリスト)のインデックスは0から始まるため、上のスクリプトのように配列の長さをループの繰り返し回数に指定する場合、
for(var n=0;n<=threads.length;n++)
と書くと、配列の長さより1回分多くループを回してしまうことになります。そのため、配列内の長さを超えたところでgetMessages()メソッドを実行使用してエラーとなっていました。
ものすごく単純なことなのですが、先駆者のみなさんのスクリプトのコピペで勉強を始めた身としては、引っかかって良かったと思える失敗でした。
ラベル:
forループ,
Google Apps Script,
JavaScript,
Python,
配列
2014年6月19日木曜日
Google Apps Script : Gmail本文をそのままをスプレッドシートに入力する方法
Google Apps Scriptには、Gmail本文を取得するメソッドとしてGmailAppクラスにgetBody()メソッドがありますが、これを使うとメール本文内の改行を示すHTMLタグである<br />までスプレッドシートに入力されてしまいます。
そこで、<br />タグなしの、本文の見た目そのままを入力したいときはgetPlainBody()メソッドを使います。
---以下スクリプト---
作成中
---以上スクリプト--
参考にさせてもらったサイト
そこで、<br />タグなしの、本文の見た目そのままを入力したいときはgetPlainBody()メソッドを使います。
---以下スクリプト---
作成中
---以上スクリプト--
参考にさせてもらったサイト
2014年6月18日水曜日
Google Apps Script : getMessages()メソッドで取得できる受信トレイスレッドの順番
GmailAppクラスのgetMessages()メソッドを使うと、自分のGmail受信トレイのスレッドオブジェクトを取得することができますが、どのような順番で取得できるのかがわからなかったのでテストしてみました。
テスト用のスクリプトは
---以下スクリプト---
function getMessageFromGmail() {
var threads = GmailApp.getInboxThreads();
for(var n=1;n<=5;n++) {
var thread = threads[n];
var msgs = thread.getMessages();
for(m in msgs) {
var msg = msgs[m];
var date = msg.getDate();
sheet.getRange(n,1).setValue(date);
}
}
}
---以上スクリプト---
Gmail受信トレイの全スレッド(実際には500スレッド)を取得し、それについてforループを5回回してスレッドを取得しています。
さらに取得した5スレッドについて内側のforループで受信日時を取得し、スプレッドシートのA列に順番に受信日時を書き込んでいます。
結果は
となりました。受信日時が新しい順に上から並びましたが、受信トレイには未読のものが残っているため、受信トレイの見た目とは異なることに注意が必要かと思います。
テスト用のスクリプトは
---以下スクリプト---
function getMessageFromGmail() {
var threads = GmailApp.getInboxThreads();
for(var n=1;n<=5;n++) {
var thread = threads[n];
var msgs = thread.getMessages();
for(m in msgs) {
var msg = msgs[m];
var date = msg.getDate();
sheet.getRange(n,1).setValue(date);
}
}
}
---以上スクリプト---
Gmail受信トレイの全スレッド(実際には500スレッド)を取得し、それについてforループを5回回してスレッドを取得しています。
さらに取得した5スレッドについて内側のforループで受信日時を取得し、スプレッドシートのA列に順番に受信日時を書き込んでいます。
結果は
となりました。受信日時が新しい順に上から並びましたが、受信トレイには未読のものが残っているため、受信トレイの見た目とは異なることに注意が必要かと思います。
ラベル:
getMessages(),
GmailAppクラス
2014年6月17日火曜日
Google Apps Script : getInboxThreads()メソッドでの最大数指定時の注意点
Google Apps ScriptでGmailの受信トレイにアクセスする場合、getInboxThreads()メソッドを使います。これにより、受信トレイ のスレッドを得ることができます。
getInboxThreads()メソッドは引数として、開始位置と最大数を指定することができます。書き方は、
var 変数名 = getInboxThreads(開始位置, 最大数);
となりますが、最大数は500に制限されているようです。
引数に開始位置と最大数を指定しないで受信トレイのスレッドを取得したとのスレッド数を調べてみました。
---以下スクリプト---
function getMaxThreadsNumber() {
var threads = GmailApp.getInboxThreads();
Browser.msgBox(threads.length);
}
---以上スクリプト---
結果は下のように500となりました。
getInboxThreads()メソッドは引数として、開始位置と最大数を指定することができます。書き方は、
var 変数名 = getInboxThreads(開始位置, 最大数);
となりますが、最大数は500に制限されているようです。
引数に開始位置と最大数を指定しないで受信トレイのスレッドを取得したとのスレッド数を調べてみました。
---以下スクリプト---
function getMaxThreadsNumber() {
var threads = GmailApp.getInboxThreads();
Browser.msgBox(threads.length);
}
---以上スクリプト---
結果は下のように500となりました。
2014年6月14日土曜日
Google Ads | AdSenseの始め方1
Google Ads(AdSense)とは、運営しているWebサイトやブログに、サイトの内容に関連する広告を掲載し、収益を上げることのできサービスです。
Google AdSense
今すぐ開始ボタンを押して次へ進みます。
Google AdSense
今すぐ開始ボタンを押して次へ進みます。
ラベル:
Google AdSense
2014年6月13日金曜日
Python | 指定した文字列を含む行とそれに続く複数行をまとめて削除する
このブログのメインテーマは、タイトルにもあるようにGoogle Apps Scriptなのですが、Pythonの勉強もしているため、時折Pythonの話題も入ります。
---以下スクリプト---
#!/usr/bin/env python
#-*- coding:utf-8 -*-
def deleteSecureNode():
datafile = "C:\test\test.txt" # 架空のパスです
savefile = "C:\test\test2.txt" # 架空のパスです"
file = open(datafile,"r")
file_out = open(savefile,"w")
line_list = file.readlines()
for number,line in enumerate(line_list):
if line[0:12] == "SECURE/ NODE":
del line_list[number:number+3]
#del line_list[number+1]
#del line_list[number+2]
#del line_list[number+3]
else:
file_out.write(line)
file.close()
file_out.close()
deleteSecureNode()
---以上スクリプト---
enumerate()の使い方を知るまでと、del文で削除したい行を指定する方法にたどり着くまでに相当な時間を費やしてしまいました。
---以下スクリプト---
#!/usr/bin/env python
#-*- coding:utf-8 -*-
def deleteSecureNode():
datafile = "C:\test\test.txt" # 架空のパスです
savefile = "C:\test\test2.txt" # 架空のパスです"
file = open(datafile,"r")
file_out = open(savefile,"w")
line_list = file.readlines()
for number,line in enumerate(line_list):
if line[0:12] == "SECURE/ NODE":
del line_list[number:number+3]
#del line_list[number+1]
#del line_list[number+2]
#del line_list[number+3]
else:
file_out.write(line)
file.close()
file_out.close()
deleteSecureNode()
---以上スクリプト---
enumerate()の使い方を知るまでと、del文で削除したい行を指定する方法にたどり着くまでに相当な時間を費やしてしまいました。
ラベル:
del,
enumerate(),
Python
2014年6月12日木曜日
記事内のスクリプトをハイライトさせて表示する方法
ブログ投稿欄内にソースコードを表示するときに、皆さんが何を使っているのかを今日知りました。
SyntaxHighlighter
しかし、まだBloggerに適用する方法がわかりません。参考になるサイトとしては
SyntaxHighlighter
しかし、まだBloggerに適用する方法がわかりません。参考になるサイトとしては
というのがあるのですが、もう一度HTMLとCSSの勉強をし直さなくては…
2014年6月10日火曜日
Google Apps Script | Spreadsheetの空白行のみを削除する
Gmail受信箱の特定のスレッドの内容をSpredsheetに書き出すためのスクリプトを、以下のサイトを参考(ほぼコピー)にして書きました。
初心者のためのGoogle Apps Script入門
実行したところ、欲しいスレッドの間に他のスレッドが含まれていると、Spreadsheetでも他スレッド分の空白行ができてしまいました。
これらの空白行を削除するスクリプトとして、自分なりに試したもののうまくいかなかったため、以下のサイトを参考(ほぼコピー)にして実行すると、やりたかったことが完璧にできました。
http://googlestyle.client.jp/sheet/class_sheet.html
---以下スクリプト---
function deleteRows() {
for(var i = lastRow; i > 0 ; --i){
var cellA = ss.getRange("A" + i)
var valueA = cellA.getValue();
if(valueA == "") {
sheet.deleteRow(i);
}
else{
}
}
}
---以上スクリプト---
自分はSheetの1行目から下に向かってA列をA1→A2→…と検索し、空白であればその行全体を削除するようなスクリプトを書いてみたのですが、削除されない行があってうまくいきませんでした。
参考にさせていただいたサイトの例では、Sheetの最終行から上に向かって検索しているのが特徴です。
初心者のためのGoogle Apps Script入門
実行したところ、欲しいスレッドの間に他のスレッドが含まれていると、Spreadsheetでも他スレッド分の空白行ができてしまいました。
これらの空白行を削除するスクリプトとして、自分なりに試したもののうまくいかなかったため、以下のサイトを参考(ほぼコピー)にして実行すると、やりたかったことが完璧にできました。
http://googlestyle.client.jp/sheet/class_sheet.html
---以下スクリプト---
function deleteRows() {
for(var i = lastRow; i > 0 ; --i){
var cellA = ss.getRange("A" + i)
var valueA = cellA.getValue();
if(valueA == "") {
sheet.deleteRow(i);
}
else{
}
}
}
---以上スクリプト---
自分はSheetの1行目から下に向かってA列をA1→A2→…と検索し、空白であればその行全体を削除するようなスクリプトを書いてみたのですが、削除されない行があってうまくいきませんでした。
参考にさせていただいたサイトの例では、Sheetの最終行から上に向かって検索しているのが特徴です。
Google Apps Script : 参考図書
製本されて出版されている日本語の参考図書は
の3つが代表的かと思います。
私は『Googleクラウドスクリプティング』を使っています。Spreadsheetの操作に関しては一通りメソッドが網羅されており、Spreadsheetでどんなことをしたいのかが分かっていれば、この本を見ながらスクリプトを書くことができると思います。
の3つが代表的かと思います。
私は『Googleクラウドスクリプティング』を使っています。Spreadsheetの操作に関しては一通りメソッドが網羅されており、Spreadsheetでどんなことをしたいのかが分かっていれば、この本を見ながらスクリプトを書くことができると思います。
ラベル:
Google Apps Script,
参考資料
2014年6月8日日曜日
Google Apps Script | Line Chart(折れ線グラフ)の表示サイズ指定について
Google Apps Scriptで作成できるチャート(グラフ)は、その表示サイズもスクリプト内で指定することができます。折れ線グラフを作成する場合の記述は
---以下スクリプト---
var lineChart = Charts.newLineChart()
.setDataTable(data)
.setTitle("グラフのタイトル")
.setDimensions(450,300) //( )内の数値を変更すると表示グラフサイズが変わる
.build();
---以上スクリプト---
のようになります。ここで、setDataTable(data)のdataは、あらかじめ作成しておいたグラフ作成用データテーブルオブジェクトです。
グラフの表示サイズはsetDimensions(450,300)で指定します。カンマ区切りの左側が横方向、右側が縦方向のサイズになります。
---以下スクリプト---
var lineChart = Charts.newLineChart()
.setDataTable(data)
.setTitle("グラフのタイトル")
.setDimensions(450,300) //( )内の数値を変更すると表示グラフサイズが変わる
.build();
---以上スクリプト---
のようになります。ここで、setDataTable(data)のdataは、あらかじめ作成しておいたグラフ作成用データテーブルオブジェクトです。
グラフの表示サイズはsetDimensions(450,300)で指定します。カンマ区切りの左側が横方向、右側が縦方向のサイズになります。
ラベル:
Google Apps Script,
チャート
Google Apps Script : DataTableオブジェクトの型について
Google Apps Scriptでチャート(グラフ)をさくせいする場合、まず、グラフに使用するData Table(表)を作成します。このData Tableはスプレッドシートにグラフの基になるデータ一覧を作成済みでも、スクリプトで改めて記述しなければなりません。
スクリプトでのData Table作成手順はざっくりと
ここで指定した型と、2の段階で実際にData Tableに適用した値の型が食い違っているとエラーとなります。
スクリプトでのData Table作成手順はざっくりと
- 列を作成する
- 行を作成する
ここで指定した型と、2の段階で実際にData Tableに適用した値の型が食い違っているとエラーとなります。
ラベル:
Google Apps Script,
チャート,
データ型
2014年6月5日木曜日
Google Apps Script : 配列に格納した値のデータ型について
複数セルの値をまとめて1つの配列に格納した場合、それぞれの値のデータ型はObjectとなるようです。
そのため、他の値と比較して条件判定する場合、「==」の左右でデータ型をそろえてやらないとうまく機能しないようです。
そのため、他の値と比較して条件判定する場合、「==」の左右でデータ型をそろえてやらないとうまく機能しないようです。
ラベル:
Google Apps Script,
データ型,
条件分岐,
配列
2014年5月23日金曜日
Google Apps Script : parseInt関数を使う場合の注意点
Google Apps ScriptはJavaScriptがベースのため、JavaScriptの関数も使えます。
今回取り上げるのはparseInt関数です。
配列内にある複数のし、その配列の先頭から順に値(文字列)を整数に変換していきますが、先頭が数値でない場合は「NaN」が結果として返ってきます。
Spreadsheetの複数セルの値を配列に入れてこの関数を適用しようとした場合、配列の先頭にくる値は数値である必要があります。
今回取り上げるのはparseInt関数です。
parseInt("文字列として書かれた数値") // 文字列として書かれた数値を整数に変換する
配列内にある複数のし、その配列の先頭から順に値(文字列)を整数に変換していきますが、先頭が数値でない場合は「NaN」が結果として返ってきます。
Spreadsheetの複数セルの値を配列に入れてこの関数を適用しようとした場合、配列の先頭にくる値は数値である必要があります。
2014年1月2日木曜日
私がプログラミングに興味を持った理由
工学系の大学を出て、メーカーでエンジニアとして働き始め、コンピュータシミュレーションを専門とするようになったにも関わらず、恥ずかしながらプログラミングを避けてきました。
大学1年時に、C言語を使った情報処理入門という講義があったのですが、さっぱりわかりませんでした。全くついていくことができませんでした。演習系のクラスだったので途中途中で課題が出され、プログラムを書いて実行結果と共に提出しなければならなかったのですが、自分の力ではどうすることもできず、近くにいたデキる人に毎度お世話になっていました。
そのときのことがずっと残っていて、プログラミングに対する苦手意識を生んでいると思っています。(今でも苦手、という意味です)
大学の研究室に所属したことのある方ならよくわかると思いますが、各研究室の雰囲気は様々で、始業時刻のようなものが決められている厳しいところもあれば、放任主義のところまで、千差万別です。私が所属していたのは典型的な後者で、研究、実験はもちろん行っていたものの、それ以外の時間は各自何をしていても構わない、といった感じでした。私は、と言えば、体育会の部活に所属していましたのでそちらの練習に行ったり、インターネット使い放題を良いことに、研究室に入り浸って遊んでいるような状態でした。
今思えば、それだけの時間を持てるのは人生の中で限られていて、何て無駄なことをしていたんだ、と後悔が止まりません。今の大学生は私が学生だった時よりも勉強や、社会に出て役立つようなことに積極的に関わったり、留学したりと、ものすごい意識の高さを感じます。
研究室に所属してからは、実験結果のデータ分析をするのにExcelを使い始めました。そこで初めてゴールシーク機能を知ったりして、実験結果の分析をしたりしていましたが、扱うデータ量がさほど多くなく、プログラムを書いて自動処理するほどではありませんでした。
大学を卒業して実験・研究技術者として働き始めると、学生時よりも格段に早く実験をまとめなければならなくなり、その作業に追われてスキルアップの時間を確保するどころではありませんでした。帰宅後や休日は学生時代と変わらず運動をしたり、ゲームをしたりして過ごしていましたので、ここでももったいないことをしていたと思います。
様々な事情で今の会社に転職しましたが、仕事で求められるスキルは前職時とさほど変わりませんでしたので、当初はプログラミングを覚える必要に迫られてはいませんでした。しかし、最近の効率化の流れは急で、お客様からも様々な自動化処理に関する問い合わせを受けるようになりました。それに対応するため、会社で開発しているソフトで使えるプログラミング言語Pythonを覚えよう、というのが私の動機です。ここまで読んでくださってありがとうございました。
大学1年時に、C言語を使った情報処理入門という講義があったのですが、さっぱりわかりませんでした。全くついていくことができませんでした。演習系のクラスだったので途中途中で課題が出され、プログラムを書いて実行結果と共に提出しなければならなかったのですが、自分の力ではどうすることもできず、近くにいたデキる人に毎度お世話になっていました。
そのときのことがずっと残っていて、プログラミングに対する苦手意識を生んでいると思っています。(今でも苦手、という意味です)
大学の研究室に所属したことのある方ならよくわかると思いますが、各研究室の雰囲気は様々で、始業時刻のようなものが決められている厳しいところもあれば、放任主義のところまで、千差万別です。私が所属していたのは典型的な後者で、研究、実験はもちろん行っていたものの、それ以外の時間は各自何をしていても構わない、といった感じでした。私は、と言えば、体育会の部活に所属していましたのでそちらの練習に行ったり、インターネット使い放題を良いことに、研究室に入り浸って遊んでいるような状態でした。
今思えば、それだけの時間を持てるのは人生の中で限られていて、何て無駄なことをしていたんだ、と後悔が止まりません。今の大学生は私が学生だった時よりも勉強や、社会に出て役立つようなことに積極的に関わったり、留学したりと、ものすごい意識の高さを感じます。
研究室に所属してからは、実験結果のデータ分析をするのにExcelを使い始めました。そこで初めてゴールシーク機能を知ったりして、実験結果の分析をしたりしていましたが、扱うデータ量がさほど多くなく、プログラムを書いて自動処理するほどではありませんでした。
大学を卒業して実験・研究技術者として働き始めると、学生時よりも格段に早く実験をまとめなければならなくなり、その作業に追われてスキルアップの時間を確保するどころではありませんでした。帰宅後や休日は学生時代と変わらず運動をしたり、ゲームをしたりして過ごしていましたので、ここでももったいないことをしていたと思います。
様々な事情で今の会社に転職しましたが、仕事で求められるスキルは前職時とさほど変わりませんでしたので、当初はプログラミングを覚える必要に迫られてはいませんでした。しかし、最近の効率化の流れは急で、お客様からも様々な自動化処理に関する問い合わせを受けるようになりました。それに対応するため、会社で開発しているソフトで使えるプログラミング言語Pythonを覚えよう、というのが私の動機です。ここまで読んでくださってありがとうございました。
ラベル:
Google Spreadsheet,
プログラミング一般
2014年1月1日水曜日
プログラミングに初めて独学で挑戦しようとする人が挫折する理由(私の場合)
問題1:自分が作ってみたいプログラムに必要なことが全て書かれている資料がない
世の中には、本やインタネット上含めて、様々なプログラミングに関する資料が出回っていますが、どれもプログラミング言語の文法の解説に終始していたり、ごく簡単な動作を実現するプログラムを例示しているだけのものがほとんどです。
中には1つのツールとして完成していて、コピペすればそのまま使えるソースコードを載せているものもありますが、それらとて自分が作りたい思い描いているものとはどこかが違うのです。違うからこそ、自分オリジナルのものを作りたいと考え、プログラミングを覚えたいと考えるはずです。
ですから、自分の理想がすでに形になっているものはこの世にはない、と割り切れるのに時間がかかります。問題2:プログラミング言語の習得と実際のアプリケーション開発の間を埋める良い資料がない
プログラミング言語を覚えるための資料はたくさんあります。最近ではCodecademyのような、オンラインで、無料で、インタラクティブに学べるサービスもあります。Codecademyは、英語に拒否反応がなければとても良い教材だと思います。日本語化も少しずつ進められているようなので、今後より多くの人が利用するようになるのではないかと思います。
Codecademyの良い点は、文法だけでなく、応用例として簡単なアプリケーションを作ってみるレッスンも用意されていることです。これをやってみると、実際のアプリケーションに文法をどう適用するのかがわかりやすくなります。
しかし、それでも実際に作ってみたいものとのギャップは大きく、どうすればよいのか路頭に迷うことになります。(私はCodecademyでPythonのレッスンを全て終え、加えてPythonからのNHTSAのAPI利用についてのレッスンにもトライしてみましたが、やはりよくわかりませんでした)
Codecademyの良い点は、文法だけでなく、応用例として簡単なアプリケーションを作ってみるレッスンも用意されていることです。これをやってみると、実際のアプリケーションに文法をどう適用するのかがわかりやすくなります。
しかし、それでも実際に作ってみたいものとのギャップは大きく、どうすればよいのか路頭に迷うことになります。(私はCodecademyでPythonのレッスンを全て終え、加えてPythonからのNHTSAのAPI利用についてのレッスンにもトライしてみましたが、やはりよくわかりませんでした)
問題3:どんな言語を覚えればよいのかわからない
問題4:言語を覚えるのに何から手をつけてよいかわからない
図書館や本屋、インターネットを検索すれば、使いたい言語について書かれた本や情報は何かしら見つかります。しかし、本当に本当の初心者が初めから独力で読み進めて、本来の目的のものを完成させるのに適した資料はないと思います。
言語というだけあってそれぞれ文法があるため、文法を解説した本やサイトは数多く見つかりますが、その言語を使って何ができるのか、を書いたものは比較的少ないです。もちろん、具体例から入っていく解説書もありますが、それらの例が自分自身の直面している課題と少しでも違っていると、途端にわけが分からなくなってしまう、というのが実感です。何しろプログラミングのことを何も知らないわけですから、プログラムのどの部分が何を意味しているのかが分からないわけで、応用が効かないからです。 そのため、とりあえず一通り文法を覚えようとするか、具体例のプログラムを書き写してみて動作を確認してみるか、の2通りになります。
そういう意味ではCodecademyは良いと思いますが、問題2のところでも書いた通り、教材と現実の差が大きく、先へ進めないことになり、問題1に戻るわけです。
言語というだけあってそれぞれ文法があるため、文法を解説した本やサイトは数多く見つかりますが、その言語を使って何ができるのか、を書いたものは比較的少ないです。もちろん、具体例から入っていく解説書もありますが、それらの例が自分自身の直面している課題と少しでも違っていると、途端にわけが分からなくなってしまう、というのが実感です。何しろプログラミングのことを何も知らないわけですから、プログラムのどの部分が何を意味しているのかが分からないわけで、応用が効かないからです。 そのため、とりあえず一通り文法を覚えようとするか、具体例のプログラムを書き写してみて動作を確認してみるか、の2通りになります。
そういう意味ではCodecademyは良いと思いますが、問題2のところでも書いた通り、教材と現実の差が大きく、先へ進めないことになり、問題1に戻るわけです。
ラベル:
Codecademy,
プログラミング一般
登録:
投稿 (Atom)