しごと自動化レシピ

WORK RECIPE GAS

同じ設備の予約時間が重なっているペアを出す

開始を含み終了を含まない時間帯として比較します。検証用ブックの入力から新しい結果シートへ出力し、元の値や設定は残して照合します。

設備別予約時間 → 重複ペアと分数(作業の流れを表す概念図)
実行確認の記録なし

公式資料を参照して構成した手順です。本記事の操作・コードの実行は未確認です。小さな入力例で期待結果を確かめてから利用してください。

できあがるもの

結果はR1・R2・10分の1行です。R2終了630とR3開始630は重複しません。

始める前に

  • 自分が編集できる新しい検証用Googleスプレッドシート。シート名を「入力」に変更
  • 拡張機能から開く紐付きApps Script。V8ランタイムを使用し、同じプロジェクトに同名関数を置かない
  • 入力は100行12列以内。出力シート名「結果」は未使用。初回実行時に対象ファイルへの権限確認が必要
入力例

入力!A1:D4は「予約,設備,開始分,終了分」「R1,会議室,540,600」「R2,会議室,590,630」「R3,会議室,630,660」。分は0時からの整数分です。

手順

  1. 新しい検証用ブックに入力例を用意します。原本や顧客情報を持つファイルでは実行せず、表と設定を小さなダミーで再現してください。空欄は文字として入れず、色・書式・非表示などを読む記事では記載の設定も手で用意します。
  2. 拡張機能のApps Scriptへ次の完全なコードを貼り付けて保存します。入力と結果のシート名は固定です。既存の結果があると上書きせず停止し、出力文字列には先頭アポストロフィを付けて数式としての再評価を避けます。
    /** @OnlyCurrentDoc */
    function recipeIntervalOverlap() {
      const ss=SpreadsheetApp.getActiveSpreadsheet();
      const s=ss.getSheetByName('入力');
      if(!s||ss.getSheetByName('結果'))throw Error('入力シートと未使用の結果名が必要');
      if(s.getLastRow()>100||s.getLastColumn()>12)throw Error('検証用100行12列以内');
      const a=s.getRange('A2:D4').getValues();
      if(a.some(r=>!Number.isInteger(r[2])||!Number.isInteger(r[3])||r[2]<0||r[3]>1440||r[2]>=r[3]))throw Error('時刻範囲を確認');
      const o=[['予約1','予約2','重複分']];
      for(let i=0;i<a.length;i++)for(let j=i+1;j<a.length;j++)if(a[i][1]===a[j][1]){
        const n=Math.min(a[i][3],a[j][3])-Math.max(a[i][2],a[j][2]);if(n>0)o.push([a[i][0],a[j][0],n]);
      }
      if(!o.length||!o[0].length||o.some(r=>r.length!==o[0].length))throw Error('出力列数を確認');
      const safe=o.map(r=>r.map(v=>typeof v==='string'?"'"+v:v));
      ss.insertSheet('結果').getRange(1,1,safe.length,safe[0].length).setValues(safe);
    }
  3. エディタからrecipeIntervalOverlapを選び手動実行します。初回は自分が選んだ対象ファイルへの権限内容を確認してください。この例はトリガーを作らず、メール送信・外部通信・ファイル削除をしません。処理後に作られた「結果」を開きます。
  4. 開始を含み終了を含まない時間帯として比較します。隣接する予約を重複にしない境界が重要です。設備名が同じペアだけを見るため、別設備の同時間予約は警告しません。結果を見て人が予約調整します。 結果はR1・R2・10分の1行です。R2終了630とR3開始630は重複しません。
  5. 結果の行数と値を入力例の期待結果へ照合し、入力シートの値と設定が元のままか確認します。同じ1日の0~1440分限定です。準備時間や清掃時間を含めたい場合は区間を拡張する規則が必要です。 再実行するなら前回の結果を別名で保管してから実行します。入力例を変更しても既存結果は自動更新されません。

期待結果と照合する

結果はR1・R2・10分の1行です。R2終了630とR3開始630は重複しません。

まずこの入力例で確認し、件数や値が一致しているかを見ます。完了表示だけで判断せず、重複・空欄・対象外データも残っていないか確認してください。

うまくいかないとき

  • 同じ1日の0~1440分限定です。準備時間や清掃時間を含めたい場合は区間を拡張する規則が必要です。
  • このGASは接続済みGoogle環境で未実行です。構文確認と公式API照合は実機実行と異なります。入力例で期待値を確認してから範囲や業務規則を変更してください。

止める・元に戻す

出力された「結果」シートだけを必要に応じて保存してから削除し、追加した関数を外します。入力表・既存設定はコードから変更していないため、テストで手動設定した部分だけを元へ戻してください。

公式資料・対応範囲

参照日:2026-10-18。公式資料の一般的な機能説明と、本記事固有の入力例の実行検証は別です。実務での短縮時間や効果は未計測です。

同じツールで試す

GASの記事一覧へ →