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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

605閲覧

GAS:外部シートを編集するには

nezumimuzen

総合スコア19

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/07/06 04:13

現在、メールの内容を正規表現で読み込みスプレッドシートへ書き出すプログラムを作っているのですが、別のスプレッドシートへも書き出したく下記コードを入力したのですが、「SpreadsheetApp.setActiveSheet」で外部シートを読み込もうとするとエラーが発生してしまいます。
スプレッドシート関数で例えるとIMPORTRANGE関数のようなものと認識しているため、確かに読み取りはできても書き出しはできないのかなという理由は納得したのですが、何か他に方法がありましたらお教え願います。

エラーメッセージ

指定したシートはスプレッドシートの一部である必要があります。

本コード

function getMail(){ var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var objSpreadsheet2 = SpreadsheetApp.openById('xxxxxxxx'); // シート名を記入。 var objSheet = objSpreadsheet.getSheetByName("シート1");  var objSheet2 = objSpreadsheet2.getSheetByName("ファイル");  var sheet = SpreadsheetApp.setActiveSheet(objSheet); var sheet2 = SpreadsheetApp.setActiveSheet(objSheet2); var start = 0; // 取得するメールの最大件数 var max = 100; // Gmailのラベル名 var threads = GmailApp.search('label:シート書き出し is:unread',start,max);   var Messages = GmailApp.getMessagesForThreads(threads); var row = sheet.getLastRow() + 1; var row2 = sheet2.getLastRow() + 1; // 見出しがあるためシートの1行目を固定 sheet.setFrozenRows(1); sheet2.setFrozenRows(1); for(var i = 0; i < Messages.length; i++) { for(var j = 0; j < Messages[i].length; j++) { var body = Messages[i][j].getPlainBody(); var date = threads[i].getMessages()[j].getDate(); var regtitle = new RegExp('タイトル:' + '.*'); var title = body.match(regtitle)[0].replace('タイトル:', '').replace('\r', ''); // 同じメールを読み込まないように、メッセージを既読にする threads[i].markRead(); // それぞれの項目をセルを指定してスプレッドシートへ転記 sheet.getRange(row,1).setValue([title]); sheet2.getRange(row,3).setValue([title]); sheet.getRange(row,1).setValue([date]); sheet2.getRange(row,2).setValue([date]); row++ row2++ } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

なにか根本的に勘違いされてる気がします。

スプレッドシート関数で例えるとIMPORTRANGE関数のようなものと認識している

全然違います。
SpreadsheetApp.setActiveSheetはあくまでアクティブなシートを変更するだけでデータを読み込む機能はありません。データの読み込みにアクティブかどうかは関係ありません。

そもそもの話として、SpreadsheetApp.setActiveSheetを呼び出す必要もなさそうです。

JavaScript

1//var objSheet = objSpreadsheet.getSheetByName("シート1"); 2//var objSheet2 = objSpreadsheet2.getSheetByName("ファイル"); 3//var sheet = SpreadsheetApp.setActiveSheet(objSheet); 4//var sheet2 = SpreadsheetApp.setActiveSheet(objSheet2); 5 6var sheet = objSpreadsheet.getSheetByName("シート1"); 7var sheet = objSpreadsheet2.getSheetByName("ファイル");

投稿2020/07/06 04:58

draq

総合スコア2573

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

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

nezumimuzen

2020/07/08 14:47

draq様 回答ありがとうございます。 教えていただいた内容で試したところ正常に動作しました! この度は誠にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問