質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

8564閲覧

Google Apps Scriptで手動での実行はできるが、時間主導型の自動実行でエラーになる

TakuyaTakeuchi

総合スコア7

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2018/01/21 05:41

編集2018/01/21 06:01

###前提・実現したいこと
ノンプログラマーですが、業務効率化のために定期的に受信するメール内の特定の文字列を抽出してSpreadSheetへ転記したい。
手順としては、Gmailでのフィルタリング・タグ付け→GoogleAppsScriptでSpreadSheetへの転記・読み込んだメールを既読にする

下記のソースコードはGoogleAppsScriptの編集画面上で実行ボタンを押すと成功するのですが、トリガーとして「時間主導型」を設定して定期実行させようとしていると、以下のようなエラーが出ています。

###発生している問題・エラーメッセージ

TypeError: null のメソッド「getRange」を呼び出せません。(行 19、ファイル「for spreadsheet」)

###該当のソースコード

google

1function getMail180109(){ 2 var sheet = SpreadsheetApp.getActiveSheet(); //スプレッドシートを読み込む 3 var start = 0; 4 var max = 1; 5 var threads = GmailApp.search('label:メルマガabc is:unread',start,max); //ラベルの付いたメールの未読のスレッドを読み込む 6 7 for(var n in threads){ 8 var the = threads[n]; 9 10 var msgs = the.getMessages(); 11 for(var m in msgs){ 12 var msg = msgs[m]; // スレッド内のメールをそれぞれチェックする 13 if( msg.isUnread() ) { // スレッド内のメールの内未読のもののみ実行する 14 var body = msg.getPlainBody(); //HTMLタグを含めないメール本文を取得 15 var URL = body.indexOf('https://hogehoge');//URLが決まったフォーマットなのでこれを探してくる 16 17 var title = body.slice(URL) //URLを取得 18 var titleA = title.split(/\n/); //改行したら区切る 19 sheet.getRange(1,1).setValue(titleA[0]);//取得した文字列をA1セルに出力 20 21 22 } 23 } 24 25 the.markRead(); //既読にする 26 } 27 Utilities.sleep(1000); 28 } 29

###試したこと
手動で実行すると成功するので何をしていいかわからない状態です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

エラーの直接の原因は、以下の行でsheetの値がnullになっているのが原因です。

sheet.getRange(1,1).setValue(titleA[0]);//取得した文字列をA1セルに出力

つまり、以下の処理が失敗しています。

var sheet = SpreadsheetApp.getActiveSheet(); //スプレッドシートを読み込む

定期実行では、ActiveなSheetは無いですよね?

投稿2018/01/21 06:32

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

したがって、

var sheet = SpreadsheetApp.getActiveSheet(); //スプレッドシートを読み込む

ここを、

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート名");

とし、どのシートを参照したいのか、特定させる必要があります。

投稿2018/01/21 13:53

true

総合スコア440

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問