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

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

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

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

Q&A

1回答

995閲覧

【GAS】予定表から行ごとに文字列を検索して、該当行と該当日付を別シートに書き込みたい

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

0グッド

0クリップ

投稿2018/05/26 08:22

編集2018/05/29 12:39

初心者です。
Google Apps Scriptで質問があります。
宜しくお願い致します。

前提・実現したいこと

スプレッドシートの予定カレンダーを、行ごとに「C」を検索キーにして、
Cがあればその行の「nn、x月」「A、B、C、EorFの日付」をsheet2に転記します。

条件
・転記範囲は予定表をカーソルで指定し、アクティブにする。
・「C」がなければ転記せず、無視する。
(バナナは「C」がないのでアクティブなセルでも転記しない。)
・アクティブのセルの行、列まで繰り返す。

【コードが不明】
・「E」より「F」の日付が優先される。
(if~else ifだとは思いますが…。)
・同じ行に複数の「A~F」が入ることもある。その場合は「お野菜」行を新しく転記する。
(重複した場合、セル範囲をColumn、offsetでよろしいんでしょうか?)

予定表
お野菜|4/1|4/2|4/3|4/4|4/5|4/6|4/7|
りんご|A |x月|B |C |D |E |F |
みかん| | |A |u月|B |C |D |
バナナ| |A |m月|B | |D |E |

sheet2
お野菜|x月|A |B |C |EorF|
りんご|x月|4/1|4/3|4/4|4/7|
みかん|u月|4/3|4/5|4/6| |

用途:
「お野菜」ごとに日付をまとめる。

初心者には難しく、コードを調べても応用できないものもありました。
勉強不足ですが、何卒ご回答宜しくお願い致します。

・発生している問題・エラーメッセージ
実行しても転記されません。

### ソースコード function myFunction() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var Calendar = sheet.getSheetByName('予定表'); var task = sheet.getSheetByName('sheet2'); var objCell = Calendar.getActiveCell();//アクティブなセル範囲を取得 var lastRow = objCell.getLastRow(); //アクティブなセル範囲の最終行 var lastCol = objCell.getLastColumn(); //アクティブなセル範囲の最終列 var yasai = 'A';//A列お野菜を指定 var A = 'A';//検索ワード var sub = '*月'; var B = 'B'; var C = 'C'; var D = 'D'; var E = 'E'; for ( var i = 1 ; i <= lastRow ; i++ ){ //最終行まで繰り返す if(i,lastCol == C){ //検索行に「C」があれば var cellA = A.getRange(A + i );//Aのセルを指定 var cellB = B.getRange(B + i );//Bのセルを指定 var yasaistr = yasai.getRange(yasai + i );//お野菜のセルを指定 var substr = sub.getRange(sub + i );//お野菜のセルを指定 var Astr = cellA.offset(0, -i).getValue();//Aの日付を取得 var Bstr = cellB.offset(0, -i).getValue();//Bの日付を取得 task.getRange(i+1,1).setValue(yasaistr);//項目行をとばして「お野菜」を転記 task.getRange(i+1,2).setValue(substr);//項目行をとばして「x月」を転記 task.getRange(i+1,3).setValue(Astr);//項目行をとばして「A」の日付を転記 task.getRange(i+1,4).setValue(Bstr);//項目行をとばして「B」の日付を転記 } } }

追記

function myFunction2() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var Calendar = sheet.getSheetByName('予定表'); var task = sheet.getSheetByName('sheet2'); var objCell = Calendar.getActiveRange().getValues();//配列に格納 var lastRow = 3; var h = Calendar.getRange(1, 1); var yasai= ''; var cellsub= 0; var cellA= 0; var cellB= 0; var cellC= 0; var Astr= ''; var Bstr= ''; var Cstr= ''; var substr= ''; var Startcell= 0; var last = task.getLastRow(); for (var i=1 ; i <= lastRow; i++){ Startcell = objCell[i].indexOf('C'); if(Startcell >= 0 ){ yasai = h.offset(i,0).getValue(); cellsub = objCell[i].search(/.*?月/); cellA = objCell[i].indexOf('A'); cellB = objCell[i].indexOf('B'); cellC = objCell[i].indexOf('C'); substr = h.offset(i,cellsub).getValue(); Astr = h.offset(0,cellA).getValue(); Bstr = h.offset(0,cellB).getValue(); Cstr = h.offset(0,cellC).getValue(); task.getRange(last+1+i,1).setValue(yasai); task.getRange(last+1+i,2).setValue(substr); task.getRange(last+1+i,3).setValue(Astr); task.getRange(last+1+i,4).setValue(Bstr); task.getRange(last+1+i,5).setValue(Cstr); } } }

ヒントを元に変更しました。配列の要素の部分一致ができません。。。

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

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

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

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

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

guest

回答1

0

javascript

1//var objCell = Calendar.getActiveCell();//アクティブなセル範囲を取得←範囲ではなくセル 2var objCell = Calendar.getActiveRange();//アクティブな範囲を取得

ということではないでしょうかね。

エラーが出ていない前提で推測すると、for文が端からスキップされたのでしょう。

[追記]
for文中の分岐により、処理そのものがスキップされているみたいですね。
(コメント欄参照)

投稿2018/05/26 12:49

編集2018/05/27 00:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/05/26 13:06

回答ありがとうございます。 早速getActiveCellからgetActiveRangeにしてみましたが、変わらずできませんでした。 エラーは前回も今回も出ておりません。実行はしているようなのですが…。まだfor文がスキップされた可能性があるということですね。ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/05/26 13:29

細かくは見ていませんので、適当な箇所でLogger.log()してみてください。 あとは、スクリプトエディタより 表示→実行トランスクリプトを確認してみてください。
退会済みユーザー

退会済みユーザー

2018/05/26 14:07

ありがとうございます。お恥ずかしながら、初めてLogger.log()を使用しました。 if文 if(i,lastCol == C){ //検索行に「C」があれば がスキップされており、検索行の範囲指定がうまくいっていないような気がしますが、 どのように記述してよいのかわかりません。よければご教授お願いします。
退会済みユーザー

退会済みユーザー

2018/05/26 14:56

> 検索行の範囲指定がうまくいっていないような気がしますが、 まぁ、よく確認していなかったとはいえ、申し訳ございませんが、上記以前にロジックがでたらめですけどね。。。 回答した責任上、以下、列挙しますのでひとまずご確認ください。 > if(i,lastCol == C) lastColって、最終列ですよね? 最終列で何と比較したいのでしょうか? > var cellA = A.getRange(A + i );//Aのセルを指定 > var cellB = B.getRange(B + i );//Bのセルを指定 > var yasaistr = yasai.getRange(yasai + i );//お野菜のセルを指定 > var substr = sub.getRange(sub + i );//お野菜のセルを指定 A、B、yasai、subは文字列ですよね。 文字列からgetRange()できますか? > var Astr = cellA.offset(0, -i).getValue();//Aの日付を取得 > var Bstr = cellB.offset(0, -i).getValue();//Bの日付を取得 -iだとループするたび左にiだけ移動しますよ。 例えば「A1」からは「A0」。 ここではどういう(相対的な)移動を想定しているのでしょうか? 転記部分は対象外の行を考慮していないですね。 マッチしなくてもiは増加しますよ。 ひとまず以上です。
退会済みユーザー

退会済みユーザー

2018/05/29 12:40 編集

多々ご助言ありがとうございます。ヒントを元に、だいぶ変更しました。 > 転記部分は対象外の行を考慮していないですね。 > マッチしなくてもiは増加しますよ。 上記に関してはまだわかりませんが、大変勉強になりました。ありがとうございます。 エラーについては、 cellsub = objCell[i].search(/.*?月/); のみエラーが発生します。 「TypeError: オブジェクト りんご,A,x月,B,C,D,E,F で関数 search が見つかりません。」 他の配列はindexOfで検索したのですが、「x月」とx部分の文字列が変わるため正規表現?で検索するためsearchにしましたが、エラーが発生します。 こちらについては別スレの方がよいでしょうか。。
退会済みユーザー

退会済みユーザー

2018/05/28 13:36 編集

修正されたコードは質問欄に追記していただいた方が見やすいです。 あと、個人的なことですが、現状、ほとんど時間が取れませんので、コードも確認できておりません。 回答はさせていただくつもりですが、時間がかかる旨、ご了承ください。 ちなみにですが、serch()はStringが対象です。 objCell[i]は配列ですよ。
退会済みユーザー

退会済みユーザー

2018/05/29 12:45

修正コードも質問欄に追記に致しました。 お忙しいところ付き合って頂き、ありがとうございます。 なるほど、やっと少し用語が繋がってきました。 配列要素の部分一致の検索は工夫が必要なのでしょうか。。。
退会済みユーザー

退会済みユーザー

2018/05/29 14:18

> 配列要素の部分一致の検索は工夫が必要なのでしょうか。。。 objCell[i]をさらにfor文で回すというのが、ご理解の及ぶ範囲ではないでしょうか。 あとですね、【コードが不明】以下の条件は考慮せずに、シンプルな条件下での転記ができるようにすることを目標にしたほうが良いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問