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

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

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

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

3回答

1094閲覧

繰り返し文を作成していますGASコードからスプレッドシートへの書き込みがわかりません

Tsubanishi

総合スコア43

Google スプレッドシート

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2020/11/12 12:36

編集2020/11/13 04:53

googleスプレッドシートで下記のGAScodeを組んでいます
スプレッドシートのA1~A10のセルに
A1セル
りんご/
みかん/
いちご/
バナナ/
上記のように1つのセルに改行されて文字が入力されています。
B1に関数のSPLIT = SPLIT(A1,"/")を入れています。この内容をB2行目からB10行目までfor文でだしたいのですが
consoleの書き込み方法まではわかったのですが
直接B行への書き込み方がわかりません。
だれか教えていただければと思います

こちらのページを参照にしています

https://tonari-it.com/gas-if/
動画でやりたいことを説明しています
https://youtu.be/s39c1KRHtQ0

Google

1 2function myFunction() { 3 const sheet = SpreadsheetApp.getActiveSheet(); 4 const lastRow = sheet.getLastRow(); 5 6 for(let i = 2; i <= lastRow; i++) { 7 if(!sheet.getRange(i, 2).getValue()){ 8 console.log(sheet.getRange(i, 1).getValue()); 9 } 10 } 11} 12

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

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

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

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

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

sawa

2020/11/13 01:18

>この内容をB2行目からB10行目までfor文でだしたい が、どういうイメージかイマイチわからないので、この内容をこういう風に出力したいという キャプチャなどあれば良いかと思います。
Tsubanishi

2020/11/13 04:57

こちらの動画でどうでしょうか?https://youtu.be/s39c1KRHtQ0 動画は自分で下にコピペしているだけですが、これをfor文で一括で出るようにしたいです A列の行が追加されるとB列も更新していきたいです
guest

回答3

0

  • script での解決を考えられている方へ
    (なぜ for を使わないほうがいいとされているか)

javascript

1const q303911 = () => { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const source = sheet.getDataRange().getValues().map(r => r[1] !== "" ? r : [r[0], ...r[0].split("/")]); 4 const maxLen = source.reduce((a,c)=> (c.length > a ? c.length: a),0); 5 const empties = Array.from({length:maxLen},_=>"") 6 const data = source.map(r=> [...r,...empties].slice(0,maxLen)) 7 sheet.getRange(1,1,data.length,max).setValues(); 8}
  • A 列を / で分割した結果が同じ個数と限らない(例えば A1 には / が 2 つ A2 には / が 3 つといった場合に途端に難易度があがるか、getRange で A 列を 1 行ずつ処理すれば難易度はあがらないが時間がかかって実用性に欠ける)
  • A 列の更新がどのようになされるかによって onEdit では実行がやりづらい可能性がある(複数、例えば A20 から A25 が埋まる、といったときの処理を onEdit でやるとなると、実際にどういうデータが渡されるかもっと仕様を開示してもらわないと作りにくい)。
  • onEdit をしない場合、行数が増えたときに全体に無駄な処理をしてしまう(B1 はすでに分割できているのに、A100 から A110 の処理のために B1 から B110 まで再処理してしまう)ことになり、実行時間が長くなったり、編集済みのセルをリセットしてしまったりする危険がある。

投稿2020/11/22 12:02

papinianus

総合スコア12705

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

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

0

ベストアンサー

for文にこだわる必要はないというか、for文を使わない方が良いと思います。

掲載された動画の操作を「マクロを記録」するとautoFillを使った記述が確認できるので、
対象セルの部分を書き換えることでやりたいことが実現できるかと思います。

投稿2020/11/13 05:52

sawa

総合スコア3002

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

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

Tsubanishi

2020/11/13 08:14

ありがとうございます。 そうなのですが、実はa列の内容はスプレッドシートを開いた時にgmailの欲しいデータを自動で入ってくるscriptとトリガーを組んでいます。 その後にマクロのauto Fill処理をする事を考えると、毎回B列の最終入力の値を変えなくてはいけません。 auto fillの範囲をB99とかにしてしまうと次に入るA列は100行目に記載されてしまいます。
sawa

2020/11/13 08:38 編集

うーん、それなら スプレッドシートを開いた時にgmailの欲しいデータが自動で入ってくるscript の方を修正した方が良さそうな気がします。 もしくは、最初からB列に関数入れとくでもよいかと。 =ARRAYFORMULA(IF(A1:A="",,SPLIT(A1:A,"/"))) for でやるなら dodox86の書かれてる通り setValueですが、相対参照のsplit関数を入れたいってことであれば適さないと思います。
Tsubanishi

2020/11/14 15:51

=ARRAYFORMULA(IF(A1:A="",,SPLIT(A1:A,"/"))) 上記の関数でできました。 ありがとうございます。 dodox86様からいただいたscriptだと#NUM!(ナンバー)が出てしまいfor文としてはいけましたが 文字が出ませんでした
guest

0

直接B行への書き込み方がわかりません。

RangeクラスのsetValueを使います。
[setValue(value) - Google Apps Script]((https://developers.google.com/apps-script/reference/spreadsheet/range#setValue(Object))

GAS

1function test35() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 console.log("sheet name: " + sheet.getName()) 4 const lastRow = sheet.getLastRow(); 5 for(let i = 2; i <= lastRow; i++) { 6 // console.log(sheet.getRange(i, 1).getValue()); 7 let s = sheet.getRange(i, 1).getValue(); 8 console.log(s) 9 10 // B列へコピー 11 // B列をRangeオブジェクトで取得し、setValue()で値をセット 12 let range = sheet.getRange(i, 2); 13 range.setValue(s); 14 } 15}

Google Apps Scriptの公式のリファレンスは一次情報として大事です。また、getValueのように、get...とあれば反対の操作のset...もあるケースが多いので、想像を働かせてみるとよいです。

ちなみに質問者さんが参考にされているサイト様の記事でも、解説がありました。
【初心者向けGAS】スプレッドシートのセルに値を入力する基礎の基礎

投稿2020/11/13 01:35

dodox86

総合スコア9183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問