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

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

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

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

Q&A

解決済

1回答

2488閲覧

スプレッドシートで処理時間の短縮をしたいんですが

dream-pusher

総合スコア11

Google Apps Script

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

0グッド

0クリップ

投稿2017/10/09 06:44

編集2017/10/09 07:09

スプレッドシートで特定の列の8行から最終行までチェックして、それぞれの処理をしています!

function timer() { var Timerss_id = SpreadsheetApp.openById('XXXXX'), Timersheet = Timerss_id.getSheetByName('name'), Timerrange = Timersheet.getActiveRange(), Timerrow = Timerrange.getRow(), Timerclock = Timersheet.getRange("I1"), Timertimeid = Timersheet.getRange("J1"), Timerlast = Timersheet.getLastRow(), Timerday = Utilities.formatDate(new Date(), "JST", "MM/dd"), Timertime = Utilities.formatDate(new Date(), "JST", "H:mm"), Timeridday = Utilities.formatDate(new Date(), "JST", "MMdd"), Timeridtime = Utilities.formatDate(new Date(), "JST", "HHmm"); Timerclock.setValue([Timerday] + ' ' +[Timertime]); Timertimeid.setValue([Timeridday]+[Timeridtime]); for (var i = 8; i <= Timerlast ; i++) { Timerbase1 = Timersheet.getRange(i, 3) Timerbased1 = Timerbase1.getValue() Timerbased2 = Timersheet.getRange(i,10) Timerid = Timersheet.getRange(i, 11).getValues() if ( Timerbased1 == "時間" ){ Timerbase1.setBackground('#FF0000') }else if ( Timerbased1 == ""){ Timerbase1.setBackground(null) }else{ Timerset1 = Utilities.formatDate(Timerbased1, "JST", "MMddHHmm") Timerbased2.setValue(Timerset1) if (Timerid <= 0) { Timerbase1.setBackground("#FFFFFF") } else if (Timerid <= 15950000) { Timerbase1.setBackground("#FF0000") } else if (Timerid <= 15950070) { Timerbase1.setBackground('#f4a460') } else if (Timerid <= 15950100) { Timerbase1.setBackground('#FFFF00') } else if (Timerid <= 15952000) { Timerbase1.setBackground('#98fb98') } else{ Timerbase1.setBackground('#FFFFFF') } } } }

改良その①

function Ttimer() { var Ttss_id = SpreadsheetApp.openById('xxxx'), Ttsheet = Ttss_id.getSheetByName('name'), Ttrange = Ttsheet.getActiveRange(), Tvalues = Ttsheet.getDataRange().getValues(),   //追加コード Ttrow = Ttrange.getRow(), Ttclock = Ttsheet.getRange("I1"), Tttimeid = Ttsheet.getRange("J1"), Ttlast = Ttsheet.getLastRow(), Ttday = Utilities.formatDate(new Date(), "JST", "MM/dd"), Tttime = Utilities.formatDate(new Date(), "JST", "H:mm"), Ttidday = Utilities.formatDate(new Date(), "JST", "MMdd"), Ttidtime = Utilities.formatDate(new Date(), "JST", "HHmm"); Ttclock.setValue([Ttday] + ' ' +[Tttime]); Tttimeid.setValue([Ttidday]+[Ttidtime]); for (var i = 8; i <= Ttlast ; i++) {  Ttbase1 = Tvalues[i-1][3]     //編集コード1    // Ttbased1 = Ttbase1.getValue()    Ttbased2 = Tvalues[i-1][10]     //編集コード2   Ttid = Tvalues[i-1][11] //編集コード3 if ( Ttbase1 == "時間" ){ Ttbase1.setBackground('#FF0000') }else if ( Ttbase1 == ""){ Ttbase1.setBackground(null) }else{ Ttset1 = Utilities.formatDate(Ttbase1, "JST", "MMddHHmm") Ttbased2.setValue(Ttset1) if (Ttid <= 0) { Ttbase1.setBackground("#FFFFFF") } else if (Ttid <= 15950000) { Ttbase1.setBackground("#FF0000") } else if (Ttid <= 15950070) { Ttbase1.setBackground('#f4a460') } else if (Ttid <= 15950100) { Ttbase1.setBackground('#FFFF00') } else if (Ttid <= 15952000) { Ttbase1.setBackground('#98fb98') } else{ Ttbase1.setBackground('#FFFFFF') } } } }

動作はしているのですが、処理時間が掛かり過ぎているので、for文の方でgetValueを多用しているので、まずgetDataRange().getValues()全体の値を取得してその値を利用してその後の処理時間を短縮したいです。
改良その①ではsetBackgroundが動作しないので、原因を調べています。
皆様のお力をお貸し下さい。
後、お勧めの本やサイトがありましたら教えて下さい。
おねがいします!

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

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

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

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

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

kei344

2017/10/09 06:55

「二次元配列の理解が不十分」とありますが、どのようなコードに変更しようとしていて、それにどういった問題があるのかをコードとともに追記されてはいかがでしょうか。
dream-pusher

2017/10/09 06:59

ご指摘ありがとうございます。ただいま修正します
guest

回答1

0

ベストアンサー

getValues で返ってくるのは二次元配列に値が入ったものなので、setBackground など Range クラスのメソッドは使えないと思います。

色指定を配列にして全体のRangeでまとめて指定するのが良いと思います。

【Class Range  |  Apps Script  |  Google Developers】
https://developers.google.com/apps-script/reference/spreadsheet/range#setbackgroundscolor

JavaScript

1 var ss = SpreadsheetApp.getActiveSpreadsheet(); 2 var sheet = ss.getSheets()[0]; 3 4 var colors = [ 5 ["red", "white", "blue"], 6 ["#FF0000", "#FFFFFF", "#0000FF"] // These are the hex equivalents 7 ]; 8 9 var cell = sheet.getRange("B5:D6"); 10 cell.setBackgrounds(colors); 11

また、背景を変えるくらいならGASで書かなくても「条件付き書式」でカバーできるかもしれません。

【Google スプレッドシートで条件付き書式ルールを使用する - パソコン - ドキュメント エディタ ヘルプ】
https://support.google.com/docs/answer/78413?co=GENIE.Platform%3DDesktop&hl=ja

投稿2017/10/09 07:36

kei344

総合スコア69364

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

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

dream-pusher

2017/10/09 07:50

回答ありがとうございます! 教えて頂いたHPを参考にコード改良してみたいと思います。 条件付き書式も試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問