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

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

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

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

Q&A

1回答

256閲覧

【GAS】エディタ上では実行できる挙動が、UI上では異なる挙動になってしまう

minnamiina

総合スコア2

Google Apps Script

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

0グッド

1クリップ

投稿2024/10/04 08:36

実現したいこと

土日の行に灰色をつけるスクリプトを作成したものを、スプレッドシート上で実行できるようにしたい。
↓エディタから実行した状態
イメージ説明

発生している問題・分からないこと

Google Apps scriptのエディタ上では問題なく動くのですが、スプレッドシートの以下のUIでボタンを押すとすべてが灰色になってしまいます。
イメージ説明
↓UIから実行した状態
イメージ説明

エラーメッセージ

error

1実行はできているのでエラーメッセージはありません。

該当のソースコード

Google

1function ColorRow() { 2 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 3 spreadsheet.getRange("A10:ZZ100").setBackground(null); 4 5 var keyword = "土"; // 色を変えたいキーワードをここに入力する 6 7 var range = spreadsheet.getDataRange(); 8 var numRows = range.getNumRows(); 9 var values = range.getValues(); 10 11 for (var i = 0; i < numRows; i++) { 12 var row = values[i]; 13 for (var j = 0; j < row.length; j++) { 14 if (row[j].toString().indexOf(keyword) !== -1) { 15 spreadsheet.getRange(i + 1, 1, 1, spreadsheet.getMaxColumns()).setBackground("lightgray"); // 色を指定する 16 break; 17 } 18 } 19 } 20 21 var keyword = "日"; // 色を変えたいキーワードをここに入力する 22 23 for (var i = 0; i < numRows; i++) { 24 var row = values[i]; 25 for (var j = 0; j < row.length; j++) { 26 if (row[j].toString().indexOf(keyword) !== -1) { 27 spreadsheet.getRange(i + 1, 1, 1, spreadsheet.getMaxColumns()).setBackground("lightgray"); // 色を指定する 28 break; 29 } 30 } 31 } 32}

Google

1function onOpen() { 2 var ui = SpreadsheetApp.getUi() 3 4 //メニュー名を決定 5 var menu = ui.createMenu("シート更新"); 6 7 //メニューに実行ボタン名と関数を割り当て 8 menu.addItem("新シート作成","Copysheet"); 9 menu.addItem("7日間削除", "DeleteRow"); 10 menu.addItem("空いた分罫線追加", "PlusBoder"); 11 menu.addItem("土日色付け(ボタン調整中)", "ColorRow"); 12 menu.addItem("祝日色付け(条件付き書式調整中)", "関数名その3"); 13 menu.addItem("1日の上に太線(やり方調べ中)", "関数名その3"); 14 menu.addItem("まとめて一気に実行(やり方調べ中)", "関数名その3"); 15 16 17 //スプレッドシートに反映 18 menu.addToUi(); 19}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

エディタで実行できることはUI上でもできることが前提の記事が多く、解決方法が見つけられなかった。

補足

特になし

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

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

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

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

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

YellowGreen

2024/10/04 10:58

同じ名前の関数が複数ありませんか?
minnamiina

2024/10/07 07:29

コメントありがとうございます!確認しましたが、同じ関数名はありませんでした。
guest

回答1

0

同じ名前の他の関数があるか、メニューから試行中の別な関数を起動しているか
どちらかでしょうか

例えば、関数名を変えてみた次のコードをお試しください

JavaScript

1function colorWeekend() { 2 // データ範囲を指定 3 const dataRange = 'A10:ZZ100' 4 // 曜日の列を指定(C列: 3) 5 const weekColumn = 3; 6 // 色を変える曜日の文字を指定 7 const keyword = '土日'; 8 // 背景色を指定 9 const bgColor = 'lightgray'; 10 11 const sheet = SpreadsheetApp.getActiveSheet(); 12 13 // 曜日の列のセルが指定の文字を含む行のセル範囲名( '10:10' などの行全体の指定 )を取得 14 const rangeNames = sheet.getDataRange() 15 .getValues() 16 .map((v, i) => v[weekColumn -1] && keyword.includes(v[weekColumn - 1]) ? i + 1 : 0) 17 .filter(v => v > 0) 18 .map(v => v + ':' + v); 19 20 // 着色する 21 sheet.getRange(dataRange).setBackground(null); 22 sheet.getRangeList(rangeNames).setBackground(bgColor); 23} 24 25function onOpen() { 26 var ui = SpreadsheetApp.getUi() 27 28 //メニュー名を決定 29 var menu = ui.createMenu("シート更新"); 30 31 //メニューに実行ボタン名と関数を割り当て 32 menu.addItem("新シート作成", "Copysheet"); 33 menu.addItem("7日間削除", "DeleteRow"); 34 menu.addItem("空いた分罫線追加", "PlusBoder"); 35 // ★ ここも関数名を変えます ★ 36 menu.addItem("土日色付け(ボタン調整中)", "colorWeekend"); 37 menu.addItem("祝日色付け(条件付き書式調整中)", "関数名その3"); 38 menu.addItem("1日の上に太線(やり方調べ中)", "関数名その3"); 39 menu.addItem("まとめて一気に実行(やり方調べ中)", "関数名その3"); 40 41 42 //スプレッドシートに反映 43 menu.addToUi(); 44}

なお、
参考までに土日の行の背景色と祝日のセルの背景色を一括で着色することも可能です…。
この場合は、祝日の判定をGoogleカレンダーで行うので、スプレッドシートを少し修正する必要があります

具体的には、B列(日)の値を1…31などの数値ではなく
2024/09/01などの日付として記入した上で、表示形式で1…31の表示にしておき
A列の月とC列の曜は計算式で表示するようにします。
スクリプトではB列の日付データの値から曜日と祝日を判定して着色するセル範囲を求めます

コードの参考例です

JavaScript

1// 土日の行と祝日のセルの背景色を指定の色にする 2// ------------------------------ 3// 祝日の判定と曜日の判定のためB列は2024/09/01など日付として入力する 4// 月と曜の列は値を直接入力するのではなく、B列の日付から計算式で求める 5// B10セルの値: 2024/09/01 6// B列のセルは、表示形式: 「数字」→ 「カスタム数値形式」に d を記入すると日のみの表示となる 7// A10セルの計算式: =MONTH(B10) 8// C10セルの計算式: =TEXT(B10,"ddd") 9// 10行目以下の行は、オートフィルで10行目からコピペ 10function colorDate() { 11 // データ範囲 12 const dataRange = 'A10:ZZ100'; 13 // 日付の列 14 const dateColumn = 2; 15 const dateColumnName = 'B'; 16 // 背景色 17 const weekendColor = 'lightgray'; 18 const holidayColor = 'aquamarine'; 19 20 // 記入されている日付の範囲内の祝日リストを取得する 21 const sheet = SpreadsheetApp.getActiveSheet(); 22 const values = sheet.getDataRange().getValues(); 23 const firstDate = values.find(v => !isNaN(new Date(v[dateColumn - 1]).getDate()))[dateColumn -1]; 24 const lastDate = values.findLast(v => !isNaN(new Date(v[dateColumn - 1]).getDate()))[dateColumn - 1]; 25 const holidays = CalendarApp 26 .getCalendarById('ja.japanese#holiday@group.v.calendar.google.com') 27 .getEvents(firstDate, lastDate) 28 .filter(v => v.getDescription() === '祝日') 29 .map(v => v.getStartTime().getTime()); 30 31 // 土日と祝日の範囲名を取得する 32 const weekendsRangeNames = values 33 .map((v, i) => new Date(v[dateColumn -1]).getDay() % 6 == 0 ? i + 1 : 0) 34 .filter(v => v > 0) 35 .map(v => v + ':' + v); 36 const holidaysRangeNames = values 37 .map((v, i) => holidays.includes(new Date(v[dateColumn - 1]).getTime()) ? i + 1 : 0) 38 .filter(v => v > 0) 39 .map(v => dateColumnName + v); 40 41 // 背景色を着色(土日 → 祝日の順なので祝日が土日を上書きして着色) 42 sheet.getRange(dataRange).setBackground(null); 43 sheet.getRangeList(weekendsRangeNames).setBackground(weekendColor); 44 sheet.getRangeList(holidaysRangeNames).setBackground(holidayColor); 45}

B列を日付データ、A列とC列を計算式にしても画面表示は同じようにできます
イメージ説明


三つとも一緒に実行する例です
先のと手法を変えてみました参考になれば…

JavaScript

1// 土日の行と祝日のセルの背景色を指定の色にする 2// 毎月の1日の行の上に枠線(太罫線)を引く 3// ------------------------------ 4// 祝日の判定と曜日の判定のためB列は2024/09/01など日付として入力する 5// 月と曜の列は値を直接入力するのではなく、B列の日付から計算式で求める 6// B10セルの値: 2024/09/01 7// B列のセルは、表示形式: 「数字」→ 「カスタム数値形式」に d を記入すると 8// 日のみの表示となる 9// A10セルの計算式: =MONTH(B10) 10// C10セルの計算式: =TEXT(B10,"ddd") 11// 10行目以下の行は、オートフィルで10行目からコピペ 12function execAllFunction() { 13 // データ範囲 14 const dataRange = 'A10:ZZ100'; 15 // 日付の列 16 const dateColumn = 2; 17 const dateColumnName = 'B'; 18 // 背景色 19 const weekendColor = 'lightgray'; 20 const holidayColor = 'aquamarine'; 21 // 枠線の初期設定 22 const borderPosition = new Map([ 23 ['top', true], 24 ['left', null], 25 ['bottom', null], 26 ['right', null], 27 ['vertical', null], 28 ['horizontal', null] 29 ]).values(); 30 const borderColor = 'black'; 31 const borderStyle = SpreadsheetApp.BorderStyle.SOLID_THICK; 32 33 // 記入されている日付の範囲内の祝日リストを取得する 34 const sheet = SpreadsheetApp.getActiveSheet(); 35 const values = sheet.getRange(1, dateColumn, sheet.getLastRow(), 1) 36 .getValues().flat(); 37 const firstDate = values.find(v => !isNaN(new Date(v).getDate())); 38 const lastDate = values.findLast(v => !isNaN(new Date(v).getDate())); 39 const holidays = CalendarApp 40 .getCalendarById('ja.japanese#holiday@group.v.calendar.google.com') 41 .getEvents(firstDate, lastDate) 42 .filter(v => v.getDescription() === '祝日') 43 .map(v => v.getStartTime().getTime()); 44 45 // 土日の行、祝日のセル、1日の行のセル範囲名を配列に蓄積 46 const weekendsRangeNames = []; 47 const holidaysRangeNames = []; 48 const firstDayRangeNames = []; 49 values.forEach((v, i) => { 50 const date = new Date(v); 51 // 土日と1日の行と祝日のセルの範囲名を取得する 52 if (date.getDay() % 6 === 0) { 53 weekendsRangeNames.push((i + 1) + ':' + (i + 1)); 54 } 55 if (holidays.includes(date.getTime())) { 56 holidaysRangeNames.push(dateColumnName + (i + 1)); 57 } 58 if (date.getDate() === 1) { 59 firstDayRangeNames.push((i + 1) + ':' + (i + 1)); 60 } 61 }); 62 63 // 背景色を着色(土日 → 祝日の順なので祝日が土日を上書きして着色) 64 sheet.getRange(dataRange).setBackground(null); 65 sheet.getRangeList(weekendsRangeNames).setBackground(weekendColor); 66 sheet.getRangeList(holidaysRangeNames).setBackground(holidayColor); 67 68 // 枠線を引く 69 sheet.getRangeList(firstDayRangeNames) 70 .setBorder(...borderPosition, borderColor, borderStyle); 71}

投稿2024/10/04 23:38

編集2024/10/09 11:48
YellowGreen

総合スコア800

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

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

minnamiina

2024/10/07 07:31

具体的なコード、そして実際に動作確認までしていただきありがとうございます! こちらで実装してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問