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

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

ただいまの
回答率

90.61%

  • Google Apps Script

    790questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 337

NI0033

score 2

初心者です。
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);
}
}
} 


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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


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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/26 22:06

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

    キャンセル

  • 2018/05/26 22:29

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

    キャンセル

  • 2018/05/26 23:07

    ありがとうございます。お恥ずかしながら、初めてLogger.log()を使用しました。

    if文 if(i,lastCol == C){ //検索行に「C」があれば
    がスキップされており、検索行の範囲指定がうまくいっていないような気がしますが、
    どのように記述してよいのかわかりません。よければご教授お願いします。

    キャンセル

  • 2018/05/26 23: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/28 00:49 編集

    多々ご助言ありがとうございます。ヒントを元に、だいぶ変更しました。

    > 転記部分は対象外の行を考慮していないですね。
    > マッチしなくてもiは増加しますよ。
    上記に関してはまだわかりませんが、大変勉強になりました。ありがとうございます。

    エラーについては、
    cellsub = objCell[i].search(/.*?月/);
    のみエラーが発生します。
    「TypeError: オブジェクト りんご,A,x月,B,C,D,E,F で関数 search が見つかりません。」
    他の配列はindexOfで検索したのですが、「x月」とx部分の文字列が変わるため正規表現?で検索するためsearchにしましたが、エラーが発生します。
    こちらについては別スレの方がよいでしょうか。。

    キャンセル

  • 2018/05/28 22:28 編集

    修正されたコードは質問欄に追記していただいた方が見やすいです。
    あと、個人的なことですが、現状、ほとんど時間が取れませんので、コードも確認できておりません。
    回答はさせていただくつもりですが、時間がかかる旨、ご了承ください。

    ちなみにですが、serch()はStringが対象です。
    objCell[i]は配列ですよ。

    キャンセル

  • 2018/05/29 21:45

    修正コードも質問欄に追記に致しました。
    お忙しいところ付き合って頂き、ありがとうございます。

    なるほど、やっと少し用語が繋がってきました。
    配列要素の部分一致の検索は工夫が必要なのでしょうか。。。

    キャンセル

  • 2018/05/29 23:18

    > 配列要素の部分一致の検索は工夫が必要なのでしょうか。。。

    objCell[i]をさらにfor文で回すというのが、ご理解の及ぶ範囲ではないでしょうか。

    あとですね、【コードが不明】以下の条件は考慮せずに、シンプルな条件下での転記ができるようにすることを目標にしたほうが良いです。

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Google Apps Script

    790questions

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