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

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

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

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

Q&A

解決済

2回答

800閲覧

指定の日付範囲内のセールの背景色を変更したい

TopingMado

総合スコア25

Google Apps Script

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

0グッド

0クリップ

投稿2020/04/14 10:05

編集2020/04/17 03:43

前提・実現したいこと

EventInfoSheetの内容に応じて、カレンダー(FortestSheet)にイベント名、イベントタイプ、イベント期間のセールを特定の色に変更したいですが、実行しても何も起きなかったです。

【EventInfoSheet】
イベント詳細を格納するシート
EventInfoSheet
【FortestSheet】
別の関数で3列目から1行目に月、2行目に日付(表示形式はdd)、3行目に曜日を出力させています。
FortestSheet

該当のソースコード

GAS

1function myFunction() { 2 const FortestSheet = SpreadsheetApp.getActive().getSheetByName("fortest"); 3 const EventInfoSheet = SpreadsheetApp.getActive().getSheetByName("EventInfo"); 4 const EventInfoValues = EventInfoSheet.getDataRange().getValues(); 5 var LastCol = FortestSheet.getLastColumn()-2; 6 var ValueList=[]; 7 8 for(var i=0;i<EventInfoValues.length;i++){ 9//タイトル行及びイベント名が空欄のデータを排除 10 if(EventInfoValues[i][0]!="イベント名" && EventInfoValues[i][0]!=""){ 11 var TestList = []; 12 TestList.push(EventInfoValues[i][0]); 13 TestList.push(EventInfoValues[i][1]); 14 TestList.push(EventInfoValues[i][2]); 15 TestList.push(EventInfoValues[i][3]); 16 ValueList.push(TestList); 17 } 18 } 19for(var y=0;y<ValueList.length;y++){ 20 21var StartDate = ValueList[y][2]; 22var StartDate = Utilities.formatDate(StartDate, 'Asia/Tokyo', 'MM/dd'); 23var EndDate = ValueList[y][3]; 24var EndDate = Utilities.formatDate(EndDate, 'Asia/Tokyo', 'MM/dd'); 25 26for(var z=0;z<LastCol;z++){ 27//最終列までセールごとに日付判定 28var CheckDate = FortestSheet.getRange(2,3+z).getValue(); 29//条件をCheckDate == StartDateに変更して見ましたが、それでも色は設定しなかったです 30if(CheckDate >= StartDate && CheckDate<=EndDate){ 31 32FortestSheet.getRange(3,4+y).setBackground("blue"); 33 34} 35} 36} 37} 38

FortestSheetに日付を一括出力する関数

GAS

1 const SetCalenderByRealseDate=()=> { 2 const TestSheet = SpreadsheetApp.getActive().getSheetByName("fortest"); 3 const realseDate = SpreadsheetApp.getActive().getSheetByName("Date").getRange("A2").getValue(); 4 var LastCol = TestSheet.getLastColumn()-2; 5 var month=[]; 6 var SetDay=[]; 7 var SetDate=[]; 8 CountEndDate(realseDate,SetDay,SetDate,month,LastCol); 9 10 for(var y = 0;y<SetDay.length;y++){ 11 TestSheet.getRange(1,3+y).setValue(month[y]); 12 TestSheet.getRange(2,3+y).setValue(SetDate[y]); 13 TestSheet.getRange(3,3+y).setValue(SetDay[y]); 14 } 15 } 16 17 const CountEndDate=(realseDate,SetDay,SetDate,month,LastCol)=>{ 18 const YobiList= ["日", "月", "火", "水", "木", "金", "土"]; 19 var StartDate = new Date(realseDate.setDate(realseDate.getDate()-1)); 20 for(var i=0;i<LastCol;i++){ 21 var CountDate = new Date(StartDate.setDate(StartDate.getDate()+1)); 22 var Yobi = CountDate.getDay(); 23 var monthDate = Utilities.formatDate(CountDate, 'Asia/Tokyo', 'MM'); 24//CheckDateは月の初めであるかを判定するため 25 var CheckDate = Utilities.formatDate(CountDate, 'Asia/Tokyo', 'd'); 26 var CountDate = Utilities.formatDate(CountDate, 'Asia/Tokyo', 'MM/dd'); 27 var CountYobi = YobiList[Yobi]; 28 //一回目は月を配列に格納、それ以降は1日のみ月を格納し、他は空欄で出力 29 if(i==0){ 30 month.push(monthDate); 31 } 32 else if(i!=0 && CheckDate==1){ 33 month.push(monthDate); 34 } 35 else { 36 month.push(""); 37 } 38 SetDate.push(CountDate); 39 SetDay.push(CountYobi); 40 } 41 } 42

GAS

1//開始日や終了日のデータ形式につきまして、下記の関数の実行LOGを追記します 2function myFunction() { 3 const FortestSheet = SpreadsheetApp.getActive().getSheetByName("fortest"); 4 const EventInfoSheet = SpreadsheetApp.getActive().getSheetByName("EventInfo"); 5 const EventInfoValues = EventInfoSheet.getDataRange().getValues(); 6 var LastCol = FortestSheet.getLastColumn()-2; 7 var ValueList=[]; 8 9 for(var i=0;i<EventInfoValues.length;i++){ 10 if(EventInfoValues[i][0]!="" && EventInfoValues[i][0]!=""){ 11 var TestList = []; 12 TestList.push(EventInfoValues[i][0]); 13 TestList.push(EventInfoValues[i][1]); 14 TestList.push(EventInfoValues[i][2]); 15 TestList.push(EventInfoValues[i][3]); 16 ValueList.push(TestList); 17 } 18 } 19 Logger.log(ValueList); 20 } 21 22/*Log ※if(EventInfoValues[i][0]!="" && EventInfoValues[i][0]!="")にすると、タイトル行が出力されてしまいます 23[20-04-17 12:31:01:089 JST] [[イベント名, タイプ, 開始日, 完了日], [イベントA, イベントミッション, Sat Apr 04 00:00:00 GMT+09:00 2020, Fri Apr 24 00:00:00 GMT+09:00 2020], [イベントB, イベントステージ, Sun Apr 05 00:00:00 GMT+09:00 2020, Wed Apr 15 00:00:00 GMT+09:00 2020], [イベントC, イベントミッション, Mon Apr 06 00:00:00 GMT+09:00 2020, Wed Apr 08 00:00:00 GMT+09:00 2020], [イベントD, イベントステージ, Tue Apr 07 00:00:00 GMT+09:00 2020, Sat Apr 11 00:00:00 GMT+09:00 2020], [イベントE, イベントミッション, Fri Apr 10 00:00:00 GMT+09:00 2020, Tue Apr 14 00:00:00 GMT+09:00 2020]] 24*/ 25

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

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

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

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

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

papinianus

2020/04/14 13:40

その図のどっちがどっちのシートかは明示したほうがいいと感じました。コード読んで処理読めば理解できるやろ、というのは不親切で回答者を遠ざける行為な気がします。
guest

回答2

0

ベストアンサー

途中で投げ出してすみませんが、エラーの再現のためには提示のシートが必要となり、作るのが大変なのでイベント情報シートのみから新規に生成することにしました。そしたら色が塗れたのでデバッグする意味が私の中で消滅しました。
(下記のようなテーブル書式なら貼り付けできるのでデバッグ可能になります)

  • EventInfoSheet
eventtypestartenddurationdetail
Amission2020/4/42020/4/2420
Bstage2020/4/52020/4/1510
Cmission2020/4/62020/4/82
Dstage2020/4/72020/4/114
2020/4/82020/4/124
2020/4/92020/4/1910
Emission2020/4/102020/4/144

この名前のシートにこういうデータがあれば q253621_re を実行するだけで新規シートに色のぬられたカレンダーができます。
実行時間はこのデータでだいたい 9 秒。あとは、データ量次第です。

javascript

1const newSheet = name => SpreadsheetApp.getActive().insertSheet().setName(`${name} : ${Utilities.getUuid()}`); // 重複しないように uuid をつけているが、運用で対処するなら外していい 2const formatSet = sheet => { 3 sheet.setFrozenRows(3); 4 sheet.setFrozenColumns(2); 5 sheet.getRange(1, 1, 2, 2).merge().setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("black").setFontColor("white").setValue("イベントカレンダー"); 6 sheet.getRange(3, 1, 1, 2).setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("green").setFontColor("white").setValues([["イベント名", "タイプ"]]); 7}; 8const dateToString = date => Utilities.formatDate(date, "Asia/Tokyo", "MM/dd"); 9const dayToString = num => ["日", "月", "火", "水", "木", "金", "土"][num]; 10const genDiffDays = d1 => d2 => (d2 - d1) / 86400000; 11const generateCalendar = (start, end) => { 12 let months = []; 13 let dates = []; 14 let days = []; 15 let cur = new Date(start.getFullYear(), start.getMonth(), start.getDate()); 16 while (cur <= end) { 17 months.push((cur.getMonth() + 1) + ""); 18 dates.push(cur); 19 days.push(dayToString(cur.getDay())); 20 cur = new Date(cur.getFullYear(), cur.getMonth(), cur.getDate() + 1); 21 } 22 return [months.map((e, i, a) => (i === 0 || e !== a[i - 1]) ? e : ""), dates, days]; 23}; 24const getRGBforEvent = (t) => { 25 const define = { 26 "mission": [255, 255, 0], 27 "stage": [255, 0, 255] 28 } 29 return define[t] ? define[t] : [255, 255, 255] 30} 31const q253621_re = () => { 32 const scheduleStart = new Date(2020, 3, 1); // スケジュールの開始日 33 const scheduleEnd = new Date(2020, 5, 30); // スケジュールの終了日 34 const eventsSheetName = "EventInfoSheet"; 35 // prepare 36 if (scheduleEnd <= scheduleStart) return; 37 const events = SpreadsheetApp.getActive().getSheetByName(eventsSheetName).getDataRange().getValues().slice(1).filter(([ev, tp, st, en]) => ev !== "" && tp !== "" && st <= en && en >= scheduleStart); 38 const eventsCnt = events.length; 39 if (eventsCnt < 1) return; 40 // カレンダーを作る 41 const target = newSheet(`${dateToString(scheduleStart)}-${dateToString(scheduleEnd)}`); // シートを作る 42 /* シートを作りたくないなら↑を消して、こう。 43 const target = SpreadsheetApp.getActive().getSheetByName("FortestSheet").clear(); 44 */ 45 formatSet(target); 46 const calendar = generateCalendar(scheduleStart, scheduleEnd); 47 target.getRange(1, 3, 3, calendar[0].length).setNumberFormat("dd").setValues(calendar); 48 calendar[2].reduce((a,c,i)=>(c === "土" || c === "日")?a.concat(i):a,[]).forEach(e=>target.getRange(2,e+3,eventsCnt+2,1).setBackgroundColor("gray")); 49 // イベント埋める 50 target.getRange(4, 1, eventsCnt, 2).setValues(events.map(([e, t]) => [e, t])); 51 target.autoResizeColumns(1, calendar[0].length + 2); // 記入項目は埋まったので、ここで列幅を調整 52 const diffFromStart = genDiffDays(scheduleStart); 53 events.map(([, t, s, e], i) => getRGBforEvent(t).concat([i + 4, 3 + diffFromStart(Math.max(scheduleStart, s)), 1, diffFromStart(Math.min(scheduleEnd, e)) - diffFromStart(Math.max(scheduleStart, s)) + 1])).forEach(e => target.getRange(...e.slice(3)).setBackgroundRGB(...e.slice(0, 3))); 54};

投稿2020/04/18 16:24

編集2020/04/27 13:37
papinianus

総合スコア12705

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

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

TopingMado

2020/04/20 04:26

お忙しい中、ご教授いただき、誠にありがとうございます。 イベントシートの情報に応じて、新規にカレンダシートを作成する形でも問題ございません。 一つ疑問がございますが、下記の日付で実行すると、3月1日から5月30日ではなく4月1日から6月30日まで出力されます。 また、scheduleStart、scheduleEndを別の日付にするとカレンダシートが作成されないです。 const scheduleStart = new Date(2020, 3, 1); // スケジュールの開始日 const scheduleEnd = new Date(2020, 5, 30); // スケジュールの終了日
papinianus

2020/04/20 10:17

jsのdateのmonthは0から11です。カレンダーの月より1つ少なくなります。
TopingMado

2020/04/22 06:52

失礼致しました。日付を変更してもカレンダーを新しく作成することができました。 お忙しい中、新しくコードを作成し、丁寧にご教授いただき、誠にありがとうございます。 理想としては土日、祝日の列を灰色に塗る予定するのと、イベントタイプに応じて背景色を変更できるとありがたいです。 土日祝日につきましては、別コード作成してなんとかなると思います。 イベントタイプに応じて背景色を変更できるようにアレンジして見たいと思います。 ご教授頂いたコードをうまく解読できていませんが、最悪の場合手動で色を変えれば済ます。 長々となりましたが、この度も貴重な時間割いて回答してください、重ねてお礼申し上げます。
papinianus

2020/04/23 01:34

イベントタイプに応じての色はどこに設定を持つのですか、コード上できめていいのでしょうか。それとも eventinfo シートに列を増やすのでしょうか? (UX 的に思いつきそうなところとして、eventinfo シートの背景色によって、色をつける、というのも可能ですが、やや処理が重くなりそうです) 想定するカレンダーの期間(2カ月程度なのか 1 年くらいなのか)とeventinfo の想定される行数をご教示ください。 土日はまあ土と日のある列を特定すればできるんで、そんなに難しい話じゃないと思いますが、↑が共有されるならあわせて考えてみます。
TopingMado

2020/04/23 01:58

いつも大変お世話になっております。 また、何度も追加要望してしまい、お手数おかけしております中、ご丁寧に返信・対応してくださり、誠にありがとうございます。 ①イベントタイプの応じて塗る色につきましては可能であれば、コード上で指定し、仮想配列で{"イベントタイプ": "〇〇", "色(RGB)":231, 239, 154 }のような形にできるとありがたいです。 ②想定のカレンダーの期間につきまして、年単位で1年~2年があれば十分だと思います。 しかし、カレンダー作成後にもイベント追加することが多々ありまして、また、以前に開催されたイベントはリセットではなく保存しなければならないので、期間を短くにして新しいカレンダーを作成し、手動で使用中のカレンダーに貼り付ければ調整できると思います。
papinianus

2020/04/26 16:02 編集

動作確認できてませんが、こういう感じかなというのを。 イベントを追加する、ということなんですが、イベントを削除しなければ期間をいじって作りなおすことで、より長い期間のカレンダーができると思うのですが、そうはできないのでしょうか。仮に何か手書きがあるとしても、むしろ作り直したカレンダーに既存の内容をコピペしたほうがうまくいきそうです。また、イベントが削除され得るかどうかは設計を左右する問題です。 (現在のコードは、短くしても動きますが、期間から外れたイベントは意図的に外しているので、行数がずれてしまい、考えておられるような調整はむずかしいというか大変手間がかかると思います。仕様を小出しにするとこういう齟齬が起きます) この表示で2年も作ったらみづらくてしょうがない気もしますが、そもそもシートの列数の上限は確認してますか?私は確認してないです。 再度伺いますがイベントの数はどの程度なんでしょうか。例えば 2 年で 10件なのか、100件なのか、1000件なのか。色をぬるにあたってイベントの数、イベントタイプの数がそれぞれ実行時間に影響します。10件だと気にすることはないと思いますが、多くなったとき実行時間制限にかかる可能性が生じます。
papinianus

2020/04/26 16:04

https://itfun.jp/2010/10/google.html > 合計で利用出来るセルの数は40万 1つのシートあたり256列まで 1つのブックでは100シートまで作ることが出来るようです。 なお、このいずれかの上限に達するまで利用出来るようです。 256 列が最大なので 1 年分すら作れません。仕様を再検討ください。
papinianus

2020/04/27 13:39

RGB と 土日対応(祝日対応したくなるのが人情ですよね…やればやるほどグーグルカレンダーでよいように思えてなりません)。ここまでは動作確認しました。 期間を指定したときに、その期間に含まれないイベントを削除する部分は維持。
TopingMado

2020/04/28 09:27

いつも大変お世話になっております。 お忙しい中、ご丁寧に返信・対応してくださり、誠にありがとうございます! >>イベントを追加する、ということなんですが、イベントを削除しなければ期間をいじって作りなおすことで、より長い期間のカレンダーができると思うのですが、そうはできないのでしょうか。 既存のイベントを再度開催すると同時に新しくイベントも開催される形が多いですね。 そのため、期間を指定し新しくカレンダーを作成し、古いカレンダーを貼り付けるのが一番かと思います。 >>再度伺いますがイベントの数はどの程度なんでしょうか。 イベント数につきましては、コンテンツリリース時の場合は10件行かないですが、次第に既存イベントに加え、新規のイベントも追加される形となります。イベントタイプは10件以内は必ず収まります。 >>RGB と 土日対応(祝日対応したくなるのが人情ですよね…やればやるほどグーグルカレンダーでよいように思えてなりません)。 確かにグーグルカレンダーでも対応できますが、普段、イベントカレンダーはGoogleのサービスを使用できない海外の方に共有する必要があり、エクセルまたはその国にあるエクセルに類似したサービスで共有しています。そのため、エクセル関数よりGASで実行した方が、別のサービスに貼り付けても問題は発生しないため、GASで自動化を捗ろとした次第です。 いつも貴重な時間を割いて、丁寧に対応してくださっていること、重ねてお礼を申し上げます。
guest

0

  • if(EventInfoValues[i][0]!="イベント名" && EventInfoValues[i][0]!=""){ で空白ではなくイベント名であることを判定条件にしているので不適切
  • if(CheckDate >= StartDate && CheckDate<=EndDate){ で checkdate は Date なのに StartDate や End Date は文字列なのでまともに火掻きできない

こうかなー、というのを。

javascript

1const q253621 = () => { 2 const FortestSheet = SpreadsheetApp.getActive().getSheetByName("fortest"); 3 const EventInfo = SpreadsheetApp.getActive().getSheetByName("EventInfo").getDataRange().getValues().slice(1); 4 const LastCol = FortestSheet.getLastColumn() - 2; 5 let ValueList = []; 6 7 for(let i = 0; i < EventInfo.length; i++) { 8//タイトル行及びイベント名が空欄のデータを排除 9 if(EventInfo[i][0] === "" && EventInfo[i][0] === "" ){ continue; } //両方とも空欄だったらスキップしたい ? (片方空欄は許す ?) 10 //if(EventInfo[i][0] === "" || EventInfo[i][0] === "" ){ continue; } //片方でも空欄があったら許さない ? 11 ValueList.push(EventInfo[i].slice(0,4)); 12 } 13 for(let y = 0; y < ValueList.length; y++) { 14 const StartDate = Utilities.formatDate(ValueList[y][2], 'Asia/Tokyo', 'MM/dd'); 15 const EndDate = Utilities.formatDate(ValueList[y][3], 'Asia/Tokyo', 'MM/dd'); 16 17 for(let z = 0; z < LastCol; z++) { 18//最終列までセールごとに日付判定 19 const CheckDate = Utilities.formatDate(FortestSheet.getRange(2, 3 + z).getValue(), 'Asia/Tokyo', 'MM/dd'); 20//条件をCheckDate == StartDateに変更して見ましたが、それでも色は設定しなかったです 21 if(CheckDate >= StartDate && CheckDate <= EndDate){ 22 FortestSheet.getRange(3 + y, 3 + z).setBackground("blue"); 23 } 24 } 25 } 26}

しかしこれ Date で比較していないのはまだよいとして、y * z で getValue してますけど、現実的な時間で終わるんですかね。表のサイズにもよるとは思いますが。
あと、 y で塗る行を求めるようですが、それだと2つのシートでイベント名とタイプの出現順が(空白行を除いて)対応していないといけないので、これでホントにいいのかなーという気がします。

投稿2020/04/14 13:39

編集2020/04/18 16:38
papinianus

総合スコア12705

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

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

TopingMado

2020/04/15 02:16

説明に不足があり、不親切であること、申し訳ございません。 また、ご回答頂き、誠にありがとうございます。 ご教授いただきましたコードを試しに実行して見ましたが、下記のエラーが出ています。 const EventInfo = SpreadsheetApp.getActive().getSheetByName("EventInfo").getValues();(行 3) TypeError: SpreadsheetApp.getActive(...).getSheetByName(...).getValues is not a function(行 3) 行3の.getSheetByName(...)に.getDataRange().を追加したところ、下記のエラーが出ます。 Exception: パラメータ(String,String,String)が Utilities.formatDate のメソッドのシグネチャと一致しません。(行 14) ・if(EventInfoValues[i][0]!="イベント名" && EventInfoValues[i][0]!="")で空白ではなくイベント名であることを判定条件にしているので不適切 こちらはタイトル行にイベント名を載せているためですが、getValuesの際に2行目からデータを獲得すれば空欄のみ判定しても大丈夫と思います。 ・if(CheckDate >= StartDate && CheckDate<=EndDate){ で checkdate は Date なのに StartDate や End Date は文字列なのでまともに火掻きできない CheckDateについては、別の関数で一括に日付を出力しており、書式は同じくMM/ddにしていますが、これだと比較できないでしょうか。 ・空白表及びタイトル行を除いたあと、yでイベント名、イベントタイプを出力後、zで横方向で日付を比較して背景色を塗るイメージでした
papinianus

2020/04/15 14:27

> 行3の.getSheetByName(...)に.getDataRange().を追加したところ ミスでした。失礼しました > Exception: パラメータ(String,String,String)が Utilities.formatDate のメソッドのシグネチャと一致しません。(行 14) これがこうなるということは、EventInfoSheet の開始日や終了日は文字列なんですかね?日付ではないのですか? > ・if(EventInfoValues[i][0]!="イベント名" && EventInfoValues[i][0]!="") ↑こうじゃなくて↓こう、ではないかという意味です。 > ・if(EventInfoValues[i][0]!="" && EventInfoValues[i][0]!="") > CheckDateについては、別の関数で一括に日付を出力しており、書式は同じくMM/ddにしています 文字列どうしなら比較できると思います。コードをみても文字列です。ただ、fortestsheetの画像の左上の赤枠を見る限り、日付になっているように見えます。なぜかは分かりませんが。 > 空白表及びタイトル行を除いたあと、yでイベント名、イベントタイプを出力後、zで横方向で日付を比較して背景色を塗るイメージでした 誤解してました。fortestsheet にあらかじめイベントが埋まっているのだと思ってました。そうではないですね。からっぽのシートを埋めるということですね。だとすればその処理方法で支障はないと思います。大変失礼しました。
TopingMado

2020/04/17 03:56

お忙しい中、ご返信いただき誠にありがとうございます。 ご質問につきまして、ご回答させていただきます。 >> Exception: パラメータ(String,String,String)が Utilities.formatDate のメソッドのシグネチャと一致しません。(行 14) >これがこうなるということは、EventInfoSheet の開始日や終了日は文字列なんですかね?日付ではないのですか? 日付だと思います、念の為、EventInfoSheetから取得したデータの配列をLOGに出力し、追記させていただきました。 >> CheckDateについては、別の関数で一括に日付を出力しており、書式は同じくMM/ddにしています >文字列どうしなら比較できると思います。コードをみても文字列です。ただ、fortestsheetの画像の左上の赤枠を見る限り、日付になっているように見えます。なぜかは分かりませんが。 元々はddだけ出力していましたが、そうなると月が欠けてしまうので、データを比較するためにMM/ddで出力するよう変更しました。しかし、データ表示の際はddだけ表示したく、dd形式で表示すると値が日付になってしまいました。 >> 空白表及びタイトル行を除いたあと、yでイベント名、イベントタイプを出力後、zで横方向で日付を比較して背景色を塗るイメージでした >誤解してました。fortestsheet にあらかじめイベントが埋まっているのだと思ってました。そうではないですね。からっぽのシートを埋めるということですね。だとすればその処理方法で支障はないと思います。大変失礼しました。 こちらこそ説明不足で大変申し訳ございません。 fortestsheetにeventinfoのイベント名、イベントタイプを出力すると同時に、対応するイベント期間を色塗りするイメージとなります。
papinianus

2020/04/18 16:40

「実行の準備をしています」となりスクリプトが実行できなくなりましたので確認できていません。 当方のミスで getDataRange を書き加えていただいていますが、これだと確認なさったように イベント名、イベントタイプといった文字のあるヘッダ行が取得されます。getRange(2,1,10,6) のようにするか、今修正したように getDataRange したあと 1 行目を捨てればいいと思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問