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

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

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

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

JavaScript

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

Q&A

解決済

3回答

5102閲覧

[GAS]1度のsetValuesで行を空けてセットしたい

Yohei04

総合スコア24

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2019/07/29 13:21

前提・実現したいこと

GASで取得したデータをスプレッドシートにセットする際、ある行を空けてセットしたいです。
具体的に言うと、1度のsetValuesで下の表の様な形でセットしたいです。(わかりにくいかもですが3行目、5行目、6行目にはなにもセットされていないです)
また何もセットしないので元々何か記入されていた場合それを消さないようにしたいです。

||列1|列2|列3|
|:--|:--:|--|
|行1|あ|い|う
|行2|え|お|か
|行3| | |
|行4|き|く|け
|行5|||
|行6|||
|行7|こ|さ|し

該当のソースコード

GAS

1const nullArray = Array("","","","","",""); 2nullArray.length = A.length; 3const totalSet = []; 4 5totalSet.push(A, B, nullArray, C); 6 sheet.getRange(1, 1, 4, A.length).setValues(totalSet);

試したこと

上記コードのように空の要素の入った配列を入れてセルに空欄をセットはできたのですが、
これだと元々セルにあった文字列を空欄で上書きしてしまうのと、
1行空ける度にnullArrayをpushしないといけないし、
""もたくさん用意しないといけないのであまりきれいじゃないと思い質問致しました。

ちなみにconst nullArray = Array(A.length);
も試しましたが、セルに「NOT_FOUND」とセットされてしまいました。

何か良い方法があれば教えて頂きたいです。
よろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

ベストアンサー

スクリプト実行時に同時に処理されていないことが前提となりますが、setValuesする範囲をgetValuesで取得した上で、変更箇所だけ置き換えて、setValuesするのがよいかと思います。

GAS

1const range = sheet.getRange(1, 1, 7, 3); 2const data = range.getValues(); 3 4data[0] = ["あ", "い", "う"]; 5data[1] = ["え", "お", "か"]; 6data[3] = ["き", "く", "け"]; 7data[6] = ["こ", "さ", "し"]; 8 9range.setValues(data); 10

投稿2019/07/31 05:36

macaron_xxx

総合スコア3191

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

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

Yohei04

2019/08/01 15:18

ご回答ありがとうございます。 やりたかったのはまさにこれです。 確かにこれならと、コードを見て少し感動してしまいました…笑 ありがとうございました!!
guest

0

残念ながらsetValues()の場合、空行はそのまま空の値で上書きされてしまいます。そこで、次のような回避策はいかがでしょうか。この方法ではGoogleの拡張サービスにあるSheets APIのvalues.updateメソッドを使用します。いくつかの方法があるかと思われますので、これをそれらの一つとしてお考え下さい。

この方法では、一度の呼び出しで空行の入った値を各行へ入れることができます。さらに、シート内の既存の値はそのまま維持され、valuesあいうえおかきくけこさしが入るセルだけが上書きされます。サンプルスクリプトは次の通りです。

サンプルスクリプト

このサンプルを使用する前に、スクリプトエディタ上で 「リソース」->「Googleの拡張サービス」 を開いてGoogle Sheets APIを有効にしてください。

javascript

1function myFunction() { 2 var spreadsheetId = "###"; // ここにspreadsheet IDを入れて下さい。 3 var range = "シート1"; // ここにシート名を入れて下さい。もしも入れたいrangeがあるようですと、A1Notationを使用してください。 4 var resource = { 5 values: [ 6 ["あ", "い", "う"], 7 ["え", "お", "か"], 8 [], 9 ["き", "く", "け"], 10 [], 11 [], 12 ["こ", "さ", "し"] 13 ] 14 }; 15 Sheets.Spreadsheets.Values.update(resource, spreadsheetId, range, {valueInputOption: "USER_ENTERED"}); 16}
  • スクリプトを実行すると、今の場合、「シート1」のシートの1行目から値が入力されます。

参考

投稿2019/07/30 07:34

kisojin

総合スコア899

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

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

Yohei04

2019/07/30 16:00

ご回答ありがとうございます。 こんな拡張サービスもあるんですね。 使ってみます!ありがとうございました!
guest

0

その要件を満たすには、
行番号を指定して、少なくとも3回セットする
または
あらかじめデータを取得して最終形態のデータを作ってからセットする
のどちらかです。

間をあけてうまいこと貼ってくれる機能はありません。

投稿2019/07/29 22:09

papinianus

総合スコア12705

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

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

Yohei04

2019/07/30 00:11

ご回答ありがとうございます。 やはりこのような機能はないですか…。 では空欄で上書きしても良い場合どのように書くのが良いでしょうか? setValuesしても(「NOT_FOUND」や「null」など)何も表示されない空の要素の作り方が他にありますでしょうか? ちなみに日付の数だけ要素が入るので月によって要素数が変わります。
papinianus

2019/07/31 10:24

なぜ解決してないの?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問