{"id":21644704,"url":"https://github.com/vectronic/timecode-spreadsheet","last_synced_at":"2026-03-19T21:02:37.524Z","repository":{"id":93817788,"uuid":"192366775","full_name":"vectronic/timecode-spreadsheet","owner":"vectronic","description":"Programme layout spreadsheet with drop/non-drop frame timecode durations (and no macros)","archived":false,"fork":false,"pushed_at":"2021-05-17T09:44:30.000Z","size":271,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-25T04:28:48.380Z","etag":null,"topics":["excel","smpte-timecode","timecode"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vectronic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-17T14:52:06.000Z","updated_at":"2023-03-30T01:03:38.000Z","dependencies_parsed_at":"2023-03-13T17:09:59.034Z","dependency_job_id":null,"html_url":"https://github.com/vectronic/timecode-spreadsheet","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vectronic%2Ftimecode-spreadsheet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vectronic%2Ftimecode-spreadsheet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vectronic%2Ftimecode-spreadsheet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vectronic%2Ftimecode-spreadsheet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vectronic","download_url":"https://codeload.github.com/vectronic/timecode-spreadsheet/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244413461,"owners_count":20448710,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["excel","smpte-timecode","timecode"],"created_at":"2024-11-25T05:41:57.893Z","updated_at":"2026-02-02T18:35:10.691Z","avatar_url":"https://github.com/vectronic.png","language":null,"readme":"# timecode-spreadsheet\n\u003e Programme layout spreadsheet with drop/non-drop frame timecode durations (and no macros)\n\n## Overview\n\nA sample spreadsheet for a programme layout providing rows for each part which consist of:\n\n- part type\n- timecode in\n- timecode out\n- duration\n\nHidden pick lists provide frame rate selection and part type selection values.\n\nHidden columns provide time in, time out and duration calculated as both frame count (drop and non-drop) and microsecond values.\n\n#### Key Features \n\n* Frame rates from 23.976 fps up to 60 fps including 29.97 and 59.94 fps (both drop frame and non-drop frame)\n* No macros, so spreadsheets using this can be easily distributed\n* Conversion between timecode, frames and duration in microseconds\n* Automatic timecode formatting including `;` for drop frame \n* Invalid value highlighting including checks for invalid frame count, invalid seconds, invalid minutes and negative values\n\n#### Key Concepts\n\nPicklists which drive programme frame rate selection and part type selection:\n\n![Picklists](images/picklists.png \"Picklists\")\n\nThe programme layout table with intermediate value columns hidden:\n\n![Layout](images/layout.png \"Layout\")\n\nThe programme layout table with intermediate value columns shown:\n\n![Layout All Columns](images/layout_all_columns.png \"Layout All Columns\")\n\n## Implementation\n\nThe following are mostly notes to myself so that I can remember what everything does...\n \n#### Conditional Formatting\n\nFormatting for drop frame or non-drop frame is based on whether the selected frame rate includes `D` in the value:\n\n\t=ISNUMBER(SEARCH(\"D\",$G$3))\n\nThe cell formatting applied is:\n\n* Non-drop frame: `00\\:00\\:00\\:00`\n* Drop frame: `00\\:00\\:00\\;00`\n\nInvalid value formatting is applied if:\n\n* text length of the value is not 8 characters\n* if the value is less than 0\n* if seconds or minutes is greater than 59\n* if the frame value is greater than allowed for the selected frame rate\n\n\t    =OR(LEN(TEXT(J3, \"00000000\")) \u003c\u003e 8, VALUE(H3) \u003c 0, VALUE(MID(TEXT(J3, \"00000000\"), 3, 2)) \u003e 59, VALUE(MID(TEXT(J3, \"00000000\"), 5, 2)) \u003e 59, VALUE(MID(TEXT(J3, \"00000000\"), 7, 2)) \u003e LOOKUP($G$3, $B$3:$B$13, $C$3:$C$13))\n\nEntries are greyed out if the row entry is not in use (indicated by description not having a value selected):\n\n\t=ISBLANK($I3)\n\n#### Conversion Formulae\n\nThe following formula converts from timecode to frame count:\n\n\t=(VALUE(LEFT(TEXT(J3, \"00000000\"), 2)) * 60 * 60 + VALUE(MID(TEXT(J3, \"00000000\"), 3, 2)) * 60 + VALUE(MID(TEXT(J3, \"00000000\"), 5, 2))) * (LOOKUP($G$3, $B$3:$B$13, $C$3:$C$13) + 1) + VALUE(MID(TEXT(J3, \"00000000\"), 7, 2))\n\nThe following formula converts from frame count to drop frame count:\n\n\t=K3 - ((((VALUE(LEFT(TEXT(J3, \"00000000\"), 2)) * 60) + VALUE(MID(TEXT(J3, \"00000000\"), 3, 2))) * LOOKUP($G$3, $B$3:$B$13, $E$3:$E$13)) - (TRUNC(((VALUE(LEFT(TEXT(J3, \"00000000\"), 2)) * 60) + VALUE(MID(TEXT(J3, \"00000000\"), 3, 2))) / 10) * LOOKUP($G$3, $B$3:$B$13, $E$3:$E$13)))\n\nThe following formula converts from drop frame count to microseconds:\n\n\t=L3 * LOOKUP($G$3, $B$3:$B$13, $D$3:$D$13)\n\nThe following formula converts from microseconds to timecode:\n\n\t=INT(TEXT(TRUNC(R3 / (60 * 60 * (LOOKUP($G$3, $B$3:$B$13, $C$3:$C$13) + 1))), \"00\") \u0026 TEXT(TRUNC(MOD(R3, (60 * 60 * (LOOKUP($G$3, $B$3:$B$13, $C$3:$C$13) + 1))) / (60 * (LOOKUP($G$3, $B$3:$B$13, $C$3:$C$13) + 1))), \"00\") \u0026 TEXT(TRUNC(MOD(MOD(R3, (60 * 60 * (LOOKUP($G$3, $B$3:$B$13, $C$3:$C$13) + 1))), (60 * (LOOKUP($G$3, $B$3:$B$13, $C$3:$C$13) + 1))) / (LOOKUP($G$3, $B$3:$B$13, $C$3:$C$13) + 1)), \"00\") \u0026 TEXT(MOD(MOD(MOD(R3, (60 * 60 * (LOOKUP($G$3, $B$3:$B$13, $C$3:$C$13) + 1))), (60 * (LOOKUP($G$3, $B$3:$B$13, $C$3:$C$13) + 1))), (LOOKUP($G$3, $B$3:$B$13, $C$3:$C$13) + 1)), \"00\"))\n\n## License\n\nMIT © Vectronic\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvectronic%2Ftimecode-spreadsheet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvectronic%2Ftimecode-spreadsheet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvectronic%2Ftimecode-spreadsheet/lists"}