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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

1354閲覧

google apps script GAS 繰り返し処理 特定の文字に反応して別のスプに抽出

laboumhaein

総合スコア16

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2021/05/14 08:43

GAS

1function myFunction() { 2 var spreadsheet = SpreadsheetApp.openById('スプレッドキー'); 3 var sheet = spreadsheet.getActiveSheet(); 4 var values = sheet.getRange('a:bf').getValues(); 5 var spreadsheet2 = SpreadsheetApp.getActive(); 6 var price = findValue(values, '変更する', 10); 7 Logger.log(price); 8 spreadsheet2.getRange('A2').setValue(price); 9 10} 11 12// 二次元配列から指定されたカラム番号の値を探す 13function findValue(values, value, column) { 14 var columnIndex = column - 1; // VLOOKUPのように引数では左から何列目と渡しているが、配列キーは0から始まるので1ズレる 15 for (var i in values) { 16 if (values[i][0] == value) { 17 return values[i][columnIndex]; 18 } 19 } 20 return false; 21}

他の方のものなどを参考にして作ったものが上のコードとなります。

・実現したいこと

■ SpreadsheetApp.openById('スプレッドキー')のA列の値が”変更する”の時、その行全て(a:bf)を取得して別のスプレッド(上のコードでは:spreadsheet2)に(a:bf)の値を表示させたいです。

初心者で質問の仕方もいたりませんがどうかご教授お願いいたします。

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

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

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

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

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

sawa

2021/05/17 08:10

質問文のコードは実行すると何が(どこまで)出来るのか、もしエラーがでるならどういったエラーが出るのか、そういった記載があると良いかもです。GASがまったくわからないのであれば、関数で抽出する方法もありますのでそっちを検討しても良いかと。
guest

回答1

0

ベストアンサー

追記
エラーが出ていたのは、forEachの閉じカッコが足りていないためでした、すみません!
あと、var values = sheet1.getRange('a:bf').getValues(); ここのシートの指定がsheetになっていたたので、sheet1に変更してます。

これでいけると思います。

gas

1function myFunction() { 2 var spreadsheet = SpreadsheetApp.openById('スプレッドキー1'); 3 var sheet1 = spreadsheet.getSheetByName('シート1'); //[todo]シート名を指定 4 5 var spreadsheet2 = SpreadsheetApp.openById('スプレッドキー2'); 6 var sheet2 = spreadsheet2.getSheetByName('シート2'); //[todo]シート名を指定 7 8 9   var values = sheet1.getRange('a:bf').getValues(); 10 11 //a1のセルはvalues[0][0]に入ってます。 12 if(values[0][0] == "変更する"){ 13 //[todo]変更するだった場合の処理 14 //setValue 1セルだけの処理だと重たくなるため、極力、getValues, setValuesの複数形がおすすめ 15 //a:brの値だけ取り出す setValues は2次元配列じゃないと貼り付け出来なのでこの形に 16 17 var setValues = [] 18 values.forEach(e=>{//取得したすべての値を確認する。 19 if(e[0] =="変更する"){ 20     setValues.push(e) // "変更する"のときの行の配列 21   } 22 }) 23 //シートへの貼り付け 24 //[todo]必要であればシートのクリアを 25 sheet2.getRange(1,1,setValues.length,setValues[0].length).setValues(setValues) 26 } 27}

追記
コメント確認しました。
そうするとこんな感じになりますね。
eがどうなってるかわからない場合は、
console.log()やデバッグを使って確認してみてくださいね!

gas

1 2var setValues = [] 3values.forEach(e=>{ //取得したすべての値を確認する。 4  if(e[0] =="変更する"){ 5    setValues.push(e) // "変更する"のときの行の配列 6  } 7} 8 9//シートへの貼り付け 10//[todo]必要であればシートのクリアを 11 12sheet2.getRange(1,1,setValues.length,setValues[0].length).setValues(setValues) 13 14

全部書いてしまいましたがこんな感じです!
[todo]と書いてあるところが質問者さんが変更すべき箇所です。

gas

1function myFunction() { 2 var spreadsheet = SpreadsheetApp.openById('スプレッドキー'); 3   var sheet1 = spreadsheet.getSheetByName('シート1'); //[todo]シート名を指定 4 5 var spreadsheet2 = SpreadsheetApp.openById('スプレッドキー'); 6   var sheet2 = spreadsheet2.getSheetByName('シート2'); //[todo]シート名を指定 7 8 9 var values = sheet.getRange('a:bf').getValues();  10   //↑これでもいいですし、面倒であれば全データを↓取得でもOKです。A:BFまでのいずれかに確実に値が入っているなら。 11 var values = sheet1.getDataRange().getValues(); 12 13 //a1のセルはvalues[0][0]に入ってます。 14   if(values[0][0] == "変更する"){ 15 //[todo]変更するだった場合の処理 16 17 18 //setValue 1セルだけの処理だと重たくなるため、極力、getValues, setValuesの複数形がおすすめ 19    //a:brの値だけ取り出す setValues は2次元配列じゃないと貼り付け出来なのでこの形に 20 var setValues = [] 21    setValues.push(values[0]) //values[0] は1行目のセルの配列 22 23    //すでにsheet2に値が入っている場合は、sheet2.clear()などで消した方がいいです。 24    25    //setValuesを使うときはこの書き方。[開始する行、開始する列,貼り付ける配列の長さ,貼り付ける2次元配列の長さ] 26    sheet2.getRange(1,1,setValues.length,setValues[0].length).setValues(setValues) 27 } 28} 29

投稿2021/05/14 13:23

編集2021/05/19 04:43
Tatsunosuke

総合スコア599

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

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

laboumhaein

2021/05/17 05:07

ご回答ありがとうございます。 例えばですが a1は空白 a2は変更する a3は空白 a4は空白 a5は変更する となっている時に 2行目と5行目のa:bfを抽出するものを作りたいです。 説明足らずで申し訳ございません。 行は最終行まで行いたいです。
laboumhaein

2021/05/19 04:28 編集

丁寧なご回答本当にありがとうごさいます。 function myFunction() { var spreadsheet = SpreadsheetApp.openById('スプレッドキー1');    var sheet1 = spreadsheet.getSheetByName('シート1'); //[todo]シート名を指定 var spreadsheet2 = SpreadsheetApp.openById('スプレッドキー2');    var sheet2 = spreadsheet2.getSheetByName('シート2'); //[todo]シート名を指定 var values = sheet.getRange('a:bf').getValues();    //↑これでもいいですし、面倒であれば全データを↓取得でもOKです。A:BFまでのいずれかに確実に値が入っているなら。 //var values = sheet1.getDataRange().getValues(); //a1のセルはvalues[0][0]に入ってます。    if(values[0][0] == "変更する"){ //[todo]変更するだった場合の処理 //setValue 1セルだけの処理だと重たくなるため、極力、getValues, setValuesの複数形がおすすめ     //a:brの値だけ取り出す setValues は2次元配列じゃないと貼り付け出来なのでこの形に var setValues = [] values.forEach(e=>{//取得したすべての値を確認する。   if(e[0] =="変更する"){     setValues.push(e) // "変更する"のときの行の配列   } } //シートへの貼り付け //[todo]必要であればシートのクリアを sheet2.getRange(1,1,setValues.length,setValues[0].length).setValues(setValues) } } こういうふうになるという認識でよろしいでしょうか? シンタックスエラーがでてるのですが}を消す。大文字の確認等をしても解決しないのご教授いただきたいです。。。 本当に初歩的な質問で申し訳ないのですがよろしくお願いします
laboumhaein

2021/05/19 06:34

できました! 長々と対応いただき本当にありがとうございました!
Tatsunosuke

2021/05/19 06:40

よかったです!頑張ってください!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問