Applications Local and Web-based applications Software Directories Need to get better about software that fulfills two categories. Software Licensing Best Practices There are four main types of Software licenses, and this is my preference order: Cloud sign-in License File Locked to a device (like a dongle) Locked to a computer Additionally, some software is one-and-done, and you have to pay for any upgrade. Other software is subscription based. Other software you can buy a version and get upgrades for free for a while (typically a year) and then pay for an upgrade later when you want/need. It is good practice to always name your computer and restart it before you license any software. When you license software, it ican be dependent on the computer name and renaming after licensing can cause some havoc. On Mac computers, the name is in the Sharing preference pane, on Windows, just hit the start menu and type “computer name.” License Models Per Software The list below is an attempt to classify these things so you don’t accidentally lock software to a device by accident. This has happened to me when I’ve made the assumption that a program is cloud, when in-fact, it is locked to a computer. Adobe is registered locally but can be unregistered locally or via their website or other machine. Each license gives you 2 seats that you can use simultaneously. Ableton Live is registered locally but can be unregistered locally or via their website. I think it’s 2 seats but I’m not really sure. I’ve never gotten a “too many seats” warning though (as of Ableton 10) Disguise Designer is locked to a computer or locked to a dongle. Dongles cost a little bit of money but they often give them out for free. I have two or three lying around. DVS (Dante Virtual Soundcard) is locked forever on a computer hardware. It’s only $50 though. 1 license / 1 seat. Madmapper needs to be registered and unregistered on the computer locally. Don’t wipe computers with a mad license or you’ll be begging support@garagecube.com for help. Each license gives you 2 seats that you can use simultaneously. Don’t be like me! Remember to remove licenses off show machines before they disappear into the black holes that some companies consider storage. I have a 4-channel media server with a bonus FX4 and a $400 monitor, left in the tile ceiling of the CDMX airport. Never getting that back 🙃 Maxon One is registered locally but can be unregistered locally or via their website or other machine. Each license gives you 1 seat. QLab is registered locally but can be unregistered locally or via their website. V4 Each license gives you 3 seats that you can use simultaneously. V5 Each license gives you 2 seats that you can use simultaneously. Vectorworks is registered locally but can be unregistered locally or via their website or other machine. Each license gives you 1 seat. Software To Design, Create, & Edit A lot of this software is cross-platform. If it isn't, chances are there's an analog with a different name. Some software has breakout pages for pro-tips and tutorials. Software To Design, Create, & Edit Ableton Live Audio editor and music composer - great for mixtapes Adobe After Effects (AE) VFX, Compositing, Motion Graphics Adobe Audition (AU) Audio Editing Adobe Bridge (BR) Local file management, batching, renaming Adobe InDesign (ID) Making decks, presentations, making books, making portfolios Adobe Lightroom (LR) Raw editing and photo library mgmt/ cloud services Adobe Media Encoder (AME) Export, watch-folders, transcode Adobe Photoshop (PS) Photo editing, still compositing Adobe Premiere Pro (PR) Video Editing, Titles, Color Apple Keynote Making decks and presentations, but you can use it for a lot of things Apple Pages Contemporary ClarisWorks. It's just like Office or Google Docs except you don't have to pay for it and your data isn't being tracked 🙃 Avid Video NLE Software I’ve never used it, and it's never been a requirement or a desired software for any company or project I’ve worked on. I’ve only seen it in the wild once or twice. That said: it is used for feature film and documentaries and sometimes tour dorks use it to edit their show before they throw it into Disguise 🤢 BMD DaVinci / Resolve Great and free video NLE and color software, but I need ADLs (Adobe Dynamic Link) too much. My need to have things colored does not outweigh the need for me to easily speak with After Effects. EDLs (Edit Decision Lists) are a pain in the ass that should be done by the editor’s assistant’s assistants. Good luck verifying any speed ramps!! The BMD universe and Adobe CC interpret speed ramping differently. The solve is to either bake the ramp before an EDL, or do your color before your ramp! EXIFTOOL A command line file auditing tool. Very similar to FFPROBE, which is FFMPEG’s auditing tool. Slightly different. I tend to use EXIF to pull metadata details from video files so I can remember what lens was on the camera, or what aperture, etc. FFMPEG / FFPROBE Command line/terminal transcode, packaging of audio and video files. Very powerful. Faster than AME but steep learning curve for non-code folks. Handbrake An FFMPEG top that's very very good. Been around forever. Immersive Designer Pro (IDP) A dongle locked x64 only projection engineering tool. It’s pretty great, but it is Windows only and x64, so you can’t run it on ARM or Apple Silicone (even using Parallels). Much of these tools can be manually rebuilt in Vectorworks with one massive piece missing: you can NDI or spout/syphon into IDP for real time previz and mapping tests. Very powerful. Every few months I try to run this on Paralells and it continues not to work (April 2023, last checked). iZotope RX Audio Editor Noise removal, steam creation, audio swiss army knife. Pricey but best in class utilities. Jokyo HAP Encoder A proprietary new version of the HAP encoder. It is an evolutionary version of the OG Vidvox HAP → Disguise HAP. Jokyo’s encoder is much better with banding and noise within gradients and introduces a new HAP format as well (HAPr). The tweakable options with Jokyo are superior as well. Can recommend. Neat DeNoise A great video / photo denoise tool (plugin for AE/PR), get its own section in software because it's so good. Omnigraffle A paid drawing app that is great for flow charts, system diagrams, projector rasters, etc. Better than drawing manually in Vectorworks, but harder than drawing automatically in Vectorworks (using ConnectCAD). ShutterEncoder A front end GUI (or “top”) for FFMPEG, FFPROBE, EXIFTOOL and more. Very good. Will do the trick for 90% of use cases. Thanks Melinda Sihalath for this one. Sketchup (SKP) A simpler tool for CAD that was free for at least a decade before it was sold by Google to another company. Lots of Millenials know how to use it. There is a free “viewer” companion app. Topaz Video Enhance AI A+ video upscale and restoration tool Vectorworks (VWX) CAD for theatrical and event design (but also for architecture, landscaping things). There is a free “viewer” companion app. Really good for projection engineering even if you're doing it manually (the built-in projector tools are not so thorough) Software To Display, Interact, & Perform A lot of this software is cross-platform. If it isn't, chances are there's an analog with a different name. Some software has breakout pages for pro-tips and tutorials. Software To Display, Interact, & Perform Ableton Live Audio editor and music composer - great for mixtapes Garagecube MadMapper (Mad / MM) Projection Mapping & Blending, Pixel & LED mapping I use it for those things, but also: Load-Testing Quick + Dirty Media Review Quick + Dirty Media Audits Garagecube Modul8 VJ party time Isadora (Izzy) A node based creative software that’s a great tool to quickly build multimedia projects with. Good for performance, theater, dance, etc. Open Frameworks (OF) Creative code and scripting environment QLab Mac only audio / video cue system. Generally speaking, the standard tool for show audio control. This is a good thing to know how to use. It’s video capabilities are great for cueing as well, but not great for mapping IMHO. Pro-Tip NDI your video cue to another program or Syphon out for final output. Resolume VJ software; multi-display; video generators; cueing. TouchDesigner Like Isadora but does more things (except projection map as well). All the Izzy dorks now use Touch. Unity Like Unreal, but now kind of like “Beta” - By that I mean penultimate. Though I think it still has logic advantages. Unreal Engine A video game engine that CT uses for complex and interactive playback where game logic is helpful or there is a requirement for real-time realistic rendering VDMX Affordable, accessible, multi-platform custom playback and mapping software. Software For Data & Management Software For Data, Numbers, & Management AirTable Super powerful spreadsheet adjacent tool that's great for managing all kinds of data. Kanban, Gantt, Automation, Calendars. Really great. I've heard it called "a better smarsheet" but I don't know what that is. Apple Numbers It's just like Excel or Google Sheets except you don't have to pay for it and your data isn't being tracked 🙃 Google Sheets Probably the best spreadsheet purist tool out there. Excel feels like ancient technology in comparison (though in some cases, you still need to use it). Software For Communications Discord Slack for board-game nerds iMessage Contemporary AIM Slack Discord for businesses and political action Calculators, Unit Conversion, & Measurements This section is a combination of apps and web apps that will help you do tons of different math things and save you some time. Standalone Calculator Applications Netmedia.dev’s Timecode Calculator Mac OS App Timecode Calculator. I've asked them to add in custom timecode... let's see! Numi A contextual calculator that will save custom functions, define variables, as well as formulas and you can use markdown within a calculator set (thanks to Sean Leo for this one). Highly recommended. Units Master Converting things like feet and meters, also a calculator for feet / inches / fractions. All about size things. You can do a lot of this in-line in Vectorworks, but this is a little faster. Their hotkeys are a little weird and can’t find the doc right now but “F” will do feet (not ‘) and “I” will do inches (not “). Or just use a spreadsheet 😉 - Google Sheets is free and good. Apple’s Numbers is free and fine – the better feature is that Apple’s Keynote and Pages have tables that allow you to use spreadsheet formulas. Microsoft’s Excel is good, too, just bulky as hell and why pay for something if you can get it for free… oh yeah because nothing is free in this life. Here’s an example Numi recipe for calculating file transfer times over x bandwidth: // manual entry // // enter target file size MBs in variable vFileSizeMB // vFileSizeMB = 3370363.64 MB = 3,370,363.64 MB vFileSizeBG = vFileSizeMB in GB = 3,370.36 GB vFileSizeTB = vFileSizeMB in TB = 3.37 TB // enter bandwidth in megabits per second // vMbiPS = 700 Mb = 700 Mb // auto calc // vMByPS = vMbiPS in MB = 87.5 MB vEstimateSeconds = vFileSizeMB/VMByPS = 38,518.44 VEstimate = vEstimateSeconds*1seconds in hours = 10 h 41 min 58 s Web Application Calculators FOV Calculator for when you need to calculate the field of view for a camera based on sensor size / lens MM / etc. Very useful. The person who made this is a very smart psychopath. Projector Central Throw Distance Calculator Brand agnostic. Definitely the go-to calculator for quick things. Good for estimating brightness. Usually not as up to date as brand calculators – there’s a lag for new projectors and lenses. You should always verify with brand calculators and sometimes, you just need to get the projector on a bench and try it out. There are some calculators that are off, but it’s usually marginal and it’s rare. Projector Screen Rando Calculators Collection of projector calculators - fL, viewing angle, throw distance etc. They’ve got most projector, models. If they don’t check a manufacturer directly. Remember a .5:1 throw isn’t 100% 1:1 between models. Chip sizes change this match just a little bit. Point being :5:1 on one model isn’t the same as .5:1 on another, but they’re close! Proportional Calculator For when you’re feeling lazy about doing proportional algebra and you don't want to open a Google Sheet or use Numi or a calculator. PPD Calculator Viewing Angle and Screen Door Math Custom Calculators My buddy Avery built out a calculator to determine a max scale based on a series of values . The goal with this tool was to be able to find what the largest scale possible is that results in whole numbers based on multiple numbers. You need whole numbers when you’re working with pixels! Brand Specific Projector Calculators BARCO throw calculator Epson throw calculator NEC throw calculator Optoma throw calculator PANAsonic throw calculator Measuring Documents Digitally For when you don’t want to open Vectorworks, or when you want to get information quick + dirty If you’re given a ground plan or elevations and they are to-scale (eg ¼” = 1’0”), you can open up the Preview app (on a mac), press Command-I, go over to the crop options, and change the units to inches. Then you make a selection box in preview, and get the approximate dimensions of that selection. In this example, I’ve made a selection that is 1x1” (the width and height). This is the equivalent of 4x4’ in ¼” scale. A good way to verify whether or not the drawing is to the scale that it is indicated to be using, is to measure it against something you “know” In ¼” scale: sheet goods are often 4x8’ AKA 1x2” doors are often 2’6”-3’ wide AKA 0.625-0.75” Any scale indicators on the page (annotated dimensions FTW) A spec for something that you can look up (like projector dimensions, for example) Unfortunate Caveat: It is fairly typical to receive drawings with indicated scales that are wrong or are inconsistent from drawing to drawing on a single page. This is something I’ve dealt with from MEPs, GCs, Architects, Scenic Designers and Manufacturers! The best thing to do is ask for something with a correctly indicated scale, but that isn’t always possible. Or learn some 3D CAD and/or 3D visual fx software and ask for the CAD! Software Utilities General Use Tools 1Password If you’re not using 1Password, or a program like it, do so immediately. 1Password is a tool that you use to track all your password and login information. You just need to know the primary password and have the secret key on hand somewhere for initial setup. I use 1Password across multiple devices, systems, and OS’ to track all my passwords. It’ll change your life. Worth every penny. DropBox offers a similar service for free (with a Pro account or higher), but I’ve never bothered. I’m sure it’s fine, but don’t know anyone who uses it! DaisyDisk Mac OS application that indexes drives / folders so that utilization can be better analyzed through visualization. If you’re trying to free up some space, or you have some unknown bloat, this is a good tool to find out why and where (see also Grand Perspective). Czkawka Duplicate file finder and more! Requires some homebrew commands to be able to use the GUI version. FreeFileSync Free, donation ware. Very similar to Sync Folders Pro, but available across different operating systems and more widely used. Have seen the fastest possible web transfers using this program. Thanks to Dylan Steenkamp for this gem. Grand Perspective Mac OS application that does exactly the same thing as DaisyDisk except it’s way less sexy. The block format, however, may be preferred over DD, which has files represented circularly. I thought they stopped developing a while ago, but they are still going as of summer 2023. Happy to see that! Jump Desktop Enterprise screenshare tool with really low latency used for Post Production work (and good for almost everything else, too). Magnet Mac OS level shortcut that allows you to use hotkeys to arrange application windows. Very good, but some Magnet shortcuts have conflicts with specific software, like After Effects. This automatically disables Magnet shortcuts when that is the active app. This is rare! I believe conflicts can be avoided, but it is a manual process of cross checking between apps. I’ll update here if/when I figure out a smarter way to fix that. Another bug is that Adobe Illustrator will work dumb slow in some cases with Magnet enabled. MonitorControl Gives you control of Audio and Brightness settings for external monitors. You know when you plug in a display and you can’t mute or use the Mac volume buttons to change the levels? This allows you to use your OS volume and brightness keys to control an external monitor – just make sure to allow it to work in Privacy & Security → Accessibility Parallels A way to run Windows OS on an Apple ARM Silicone. On older devices (MacIntel), BootCamp is preferable. On ARM, you can’t run contemporary AAA games, but you can run Star Wars Battlefront II (the OG one from 2005). Parsec A screenshare software that is very reliable and has a good frame rate. Developed originally by Unity for cloud gaming. Good for remote management, but has a very annoying setup protocol that I’ll breakout here at some point. Can hit servers with tons of screens, but not Mosaic. Windows/Mac. Restart on Crash Windows utility that you can set to automatically launch a crashed program. Be warned: increase the timeout so you don’t launch tons of application instances. Also, doesn’t work if theres a system dialog that hangs the program… ScreenConnect A nicely priced screenshare software with tons of iT features, tiered access levels, managed accounts, the ability to brand the application to your company. Can hit servers with up to 8ish screens, including Mosaic. Windows/Mac. Latency aggressive for post-production work but good for IT. Sync Folders Pro Great auto-sync, backup, merge tool. Build and save actions. Recommended. Velja Mac OS level shortcut application that allows you prompt for browser selection for any link clicked on the OS level, or to set rules to open specific browsers, or do specific actions based on a link type. Here’s some rules I set up so that all things google happen in Firefox. This means that I can be logged into G-Suite in Firefox, but not use it for anything except for G-Suite (except google.com for searching). If logged out of Google in Safari, this prevents Google from tracking my searches against my email data. I originally created this information with Google Docs and I’m surprised I haven’t got a DDS agfp9jadgm’;dgz aefdsii ///// shutdown /s / VLC (Video Lan Client) A utilitarian AV player for Mac/Windows that’s been around since forever. It can play most, but not all, things. It’s free. You can playlist assets. A very good swiss army knife. Has command line controls, too! WebKiosk A lockdown app for Mac OS by xproline.io to turn a Mac into a locked kiosk running a WebApp. Paid version. Used it in 2024 for a bunch of webapp demos and it works real good. Link . WiFi Explorer Mac OS application that allows you to see all the available wifi networks around you. This can help you narrow down channel usage to prevent congestion. It's also helpful to determine WAP placement. Some pro-tips here . WinDirStat A Windows application that does the same thing as DaisyDisk or Grandperspective: visually indexes hard drive utilization to help manage computer storage. Adobe After Effects All Things After Effects After Effects Introduction & Hotkeys Learning After Effects, and becoming really good in After Effects is maybe the best gateway drug to creative visual applications. If you use it a lot, you’ll learn a ton about editing, graphics, layout, 3D, compositing, scripting to make your life easier, templating, workflow management and optimization, render farms, what’s possible with plugins, and color correction (to name just a few). These things have other suites of programs dedicated to just that one thing. The skills you learn in AE will translate to these other programs and vice versa. In some cases, AE is better than its competition or sister programs. Good example of that? AE is 10x better at keying out backgrounds than Photoshop. It’s also got a much better suite of color correction. So I find myself sometimes using AE to do select work that I used to do in Photoshop. I’ve probably logged more flight hours in After Effects than any other program. I’m a utilitarian expert and can do spec work, I’m just not good enough to make sick marketing animations for social media under creative directors who say “make it pop.” Usually my work in AE is clean-up, finishing, post supervision animatics, compositing, or content templates for complex multi-channel media projects. I sometimes use it to make things for my creative practice, but it’s been a while. Hotkeys After Effects shortcuts are critical to a speedy workflow. Here are some of my favorites – oh, and you can easily create your own, too! Shift, Command, and Option are all modifier keys. The below shortcut keys are for Mac, but if you substitute Command (⌘) for Control, they should work on Windows as well. Overall ⌘ + Option + ; App settings ⌘ + 0-9 Workspace Panels ` Make selected panel full-window Shift + ~ Collapse / Expand selected panel Timeline Navigation and Controls I/O Go to in, go to out B/N Set In, Set Out Page Up / Page Down ⌘ + ← / ⌘ + → Move the timeline indicator Forward and Back a Frame (hold shift and the hotkey to advance 10 frames or reverse 10 frames) ⌘ + ↑ / ⌘ + ↓ Select layer above / below ⌘ + Option + ↑ / ⌘ + Option + ↓ Move layer up / down in stacking order Option + Page Up / Option + Page Down Nudge a layer forward / back 1 frame Keyframe S Scale P Position R Rotation T Opacity EE Expose Expressions U Expose all variables with keyframes Misc ⌘ + Shift + / Add to Render Queue ⌘ + K Comp Settings ⌘ + / Add selected item to comp (from project window) After Effects Scripts & Plugin Directory Scripts are additional tool panels in After Effects that allow you to speed things up. Scripts are also used for automation – like a "Find & Replace" script. Plug-Ins are closer to programs... within a program. High-level difference between the two: a script is run manually and/or can be added as a UI panel. A Plug-in lives in Effects & Presets. AE Scripts AE Scripting is time saving. Most of my scripts come from aescripts.com . I probably own about 50. Some are donation-ware. Try to donate if/when you can! Not all AE scripts exists at this URL and not all tools on this URL are technically “scripts” – some are plugins. AE-apprepend Free - god bless the people responsible for this. This handy script will add a prefix or suffix to everything in your render queue (like “-422” for example). AE Global Renamer If you have a comp tree that has a variable, you can build your comp tree to have things like “ProjectName-%AssetName-Render” and folders in your project bin like “%AssetName” and you can find and replace that variable using this script. Or add a suffix or prefix to certain comps. Fantastic. Auto Crop 3 This crops a nested precomp to a rectangle representing whatever is in the current frame. I use this a ton for Projection Mapping and template work so that I can build a key content comp and then have renderers comps that only target certain areas/surfaces. Comp Buddy Light wrap and edge blur – not as thorough as Redgiant's Supercomp, but does the job. Find and Replace in Expressions Thank god for Troy Yarnell, whoever you are. Does it exactly what it says. Useful for (among other things) when you have expressions referencing a controller and the controller needs to move somewhere else. LockProperties This will lock selected properties of a layer - like position, or scale, for example. Great for templates. MatchCompDuration This will change comp duration of selected layers in a comp to match the CTI, the comp duration or with custom duration. Options: include nested layers, include locked layers. Monospacer Allows you to make any font a monospace font, useful when you want to have a custom timecode display. Move Anchor Point 4 A click of a button will change the anchor point to the top left, bottom right, center etc, of a layer based on A) the layer B) the comp C) selection RD Comp Setter Free - Change FPS, resolution, duration etc of comps very quickly and/or in a batch. Render Frame at Markers So you need to export a ton of stills from an After Effects comp for some reason? Can also be used to export stills from a finished product – way faster to use this tool in After Effects than to manually export a ton of stills using Premiere. Give Lloyd some money for this Name Your Own Price tool. True Comp Duplicator This duplicates a comp and all of its nested comps with select variables / inclusions / exclusions. You can duplicate a whole chain of comps, but you can set it to not duplicate a key resource comp. Also great for template building or reusing. At some point I’ll write out a TCD workflow example. I use it a lot. AE Plugins Many of these also work in Premiere, with more limited functionality. Blace Plugins Several tools that use machine learning and/or AI Depth Scanner An “AI” tool that you can use to create faux depth in an image (think DOF). This tool works incredibly well off-label as a way to create foreground / background mattes. Blace makes some other matte and greenscreen tools, but I’m guessing those use a similar AI method. To crank it up, throw some levels on a luma matte. Local Diffusion This is their generative AI plugin. It’s incredible. After playing with it a ton on my Mac M1 (would be better on a Windows PC w/ a nice RTX card), I’ve found a combination that works quite nicely: Approx ~3 seconds to render a frame in a 1080 sequence where the source video is some XT3 content with a LUT on it. 23.976. The tool can be incredibly finicky rendering. You can’t render an export properly… You have to ram-preview and then export. This takes a long time, so you need to be patient! Otherwise, it will crash. I suspect there’s a memory leak, as it will crash during use, too. This makes using it for production extremely limited. More to come on that. Boris FX & Mocha Lots of good repair stuff as part of a CONTINUUM license. Boris’ full suite is stellar, too, but it’s expensive to have everything. I can recommend Sapphire for fun FX. Mocha has a free limited version attached to After Effects that is a superior tracking and masking tool over the built in AE tools. That said: AE’s masking and tracking covers 70% of my use cases and I’m often too lazy to take the extra step to work faster and smarter in Mocha 🤦♀️ Digital Anarchy's Flicker Free Helps repair media that has rolling refresh bands due to incompatible shutter speeds and frame rate combinations with non-continuous lighting sources like CFL bulbs or projection lamps. This doesn't fix all the problems, but it does fix many many of them. Highly recommended. This plug has been around for a decade and sometimes works magic, and other times, doesn’t. Shot a concert at 120fps and 1/120.3 and it took care of it. Doesn’t do as good of a job with rolling refresh bands (like on an LED screen or in projection). A good reminder to : ALWAYS CHECK YOUR FOOTAGE! Mister Horse Used to be a buy once and occasionally pay to upgrade. Now it’s a subscription model. Great motion plug for AE (and Premiere). Can recommend a few different plugins. The text one, the background one, the shapes one, the transition one. Neat Video Reduce Noise A plugin that reduces noises very well. Best in class for noise reduction. Red Giant / Maxon Many different tools, below are some of my favorites. Colorista Color Correction suite Form Another particle system. Magic Bullet / Looks Color and looks effect chain suite. Gateway drug. Mir Another particle system. Particular A particle systems generator tool with a ton of options and presets. Good for snow, rain, smoke, fog, weird shit. Primatte Green screen / color key tool when Keylight doesn’t get you there SuperComp A tool that allows you to comp things way better. Lightwrap, color matching, etc. If you’re doing a ton of greenscreen, this tool is critical! Video Copilot Andrew Kramer's plug-in and script company. He used to update frequently, but now I think he works at ILM. Even though the tools are beginning to show their age, they're still some of the best. Element 3D Gives you some very basic 3D capabilities in AE. Pretty decent for basic 3D integration. Not for modeling, but incredibly useful. FX Console #1 must have IMHO. A free plugin that allows you turn pretty much anything into a key-command. Works like Spotlight / Alfred but within After Effects. Optical Flares Custom optical flares. Not radically different than Red Giants’ version, but it’s a perpetual license which is sometimes preferred. After Effects Expressions Expressions in After Effects is basically in-line scripting (language = JavaScript) within an effect or transform. It's incredibly powerful and useful. Expressions Resources Great resource: http://www.motionscript.com/ Another great resource https://ae-expressions.docsforadobe.dev/ "If Else" How To https://www.premiumbeat.com/blog/use-ifelse-statements-effects/ Info on time expressions in After Effects https://ae-expressions.docsforadobe.dev/time-conversion.html How to parse comp names for things like lower 3rds: https://lova.tt/split-sourcetext-from-comp-name Sample Expressions This is where I dump some useful AE expressions that I use often. Remember that you can copy and paste expressions by selecting the expression, then going to File→Copy Expression Only and then pasting it onto a layer that has the same variables - it will automatically paste that expression on the same property! Layer Controls Using another Layer’s visibility (eye) to turn off/on another layer (apply to opacity) target = thisComp.layer("MyComp") ; o1 = [100] ; o2 = [0] ; if (target.active == true) {o1} else {o2} ; Using a Checkbox Control to toggle an effect on or off thisComp.layer("FX CONTROLS").effect("FX ON / OFF")("Checkbox")*100 Using a Checkbox Control to toggle a layer on or off if (comp("CompName%%%").layer("GRID CONTROL").effect("CheckboxName%%%")("Checkbox") > 0 ) {100} else {0}; Text Source text populates from timecode in current timecode format (numbers or 0:00:00:00) timeToCurrentFormat() Source text populates in frame number format timeToFrames() Source text populates in frame number format with leading digits frames = timeToFrames(time, 60); // Replace fps with your actual frames per second value framesString = pad(frames, 5); // 5 is the desired # of digits, adjust as needed function pad(num, size) { var s = num + ""; while (s.length < size) s = "0" + s; return s; } framesString; Source text populates frame number in number format with prefix timeX = timeToFrames() "frame: "+timeX Source text for a text layer is comp name compName = thisComp.name Source Text Parses From Comp Name (ie, if comp name = “FARTS//Jeff Bezos”, it will populate “Jeff Bezos” in the text field). Learned this from ukrmedia ( source ) compName = thisComp.name thisComp.name.split("//")[1] Position & Scale This will automatically scale, and keep proportional, a layer to fit a comp based on width scaleX = thisComp.width*(100/thisLayer.width); scaleY = thisComp.width*(100/thisLayer.width); [scaleX, scaleY] This will automatically position a 200x200px box (shape layer) to fit into a 200x200 (per box) grid and place it in the third box from the closest corner. The “-1” multiplier determines which corner in polar terms (X,Y). -1, -1 for top left; 1, -1 for top right; -1, 1 for bottom left; 1, 1 for bottom right. positionX = -1*[Math.floor(thisComp.width/2)-(Math.floor(thisComp.width/2)%200)-300]; positionY = -1*[Math.floor(thisComp.height/2)-(Math.floor(thisComp.height/2)%200)-300]; [positionX, positionY] Using the size of an object to set the anchor point as the top left of that object mathX = content("Rectangle 1").content("Rectangle Path 1").size[0]; mathY = content("Rectangle 1").content("Rectangle Path 1").size[1]; x=value[0]+mathX/2-mathX; y=value[1]+mathY/2-mathY; [x,y] After Effects Gotchas Color After Effects and Premiere interpret color differently for some, but not all, footage types – so if you throw a LUT on a clip via Lumetri and then apply all the same settings in both applications, to the same clip, the color might be different. I figured this out when doing a quick and dirty color correct, thought my footage was borked, and then looked at it in Premiere – where it looked… fine. After Effects can be stupid slow using Lumetri. In general, Premiere’s version of Lumetri is superior and you won’t take any significant performance hit. It’s just a bummer because color correcting in-comp is a superior work flow for VFX. Performance After Effects can be really slow, but it is very good in telling you why it’s slow [in almost all ways]. In most cases, you can just wait, but if you’re rendering a lot of very big things, you can make a significant improvement to render speeds by doing a little composition tweaking. Maybe Fast Box Blur looks good enough instead of Lens Blur (it probably doesn’t, but you should check anyway). Your first thing should be to always purge the memory and disk cache. Once you’ve filled up the cache, After Effects functions like a complete idiot. After Effects does not remind you that your cache is full, you have to remember to do this when performance begins to drag. To analyze why else your composition is taking so long to render, you can really dig through the program. At the very bottom of the timeline is a little button called “Expand or Collapse the Render Time pane.” This toggle will show you down to the sub-settings of an effect why your rendering is taking so long. In the image above, it’s telling me that “another layer” is taking 880ms per frame to render. Of that, 724ms are effects. Of that, 699ms is Lumetri, and 25ms is CC tiler. The very bottom tells me the Frame Render Time is 886ms. In this example, the other layers only represent 6ms per frame to render. What this tells me is that Lumetri is quite slow in this scenario. Can I use a different effect stack to speed it up and reach the same image goals? Is it faster to pre-process the color in another application? After Effects Randos Want to create a 360 scene so someone can watch your video in VR or pan and scan? Here’s How to take a 3D scene and then make it rectilinear. Want to automatically scale and center an object using After Effects? Use track motion and create a clean track for Position, Scale, Rotation. Apply that data to a null. Create a 3D camera. Parent the Null to the camera. Then, make your target layer a 3D layer. Donezo! Effects Manager Plugin borked? Launch the effects manager within After Effects and disable it. Select the Dropdown menu: Effect → Effects Manager After Effects Sorting Order This doesn’t follow ASCII or Mac OS sorting, which is frustrating and annoying. Pick a lane, nerds! space ! $ & % etc Numbers _ @ etc Letters ~ etc Adobe Premiere Pro The world's most commonly used NLE Premiere Introduction & Hotkeys Think Final Cut Pro 7 circa 2006, but with bugs that have been unsolved for over a decade. If you understand how to use NLEs and you’re using it as a simple NLE, then Premiere is great. If you want to do anything scripted, automated, or complex it’s brutal to use versus using After Effects. That said, it’s fine. It renders things quick and performs fairly well. It is not my favorite application but I’ve spent a ton of time in there. It's a love/hate relationship. Hotkeys Premiere has a handy tool for letting you find and modify keyboard shortcuts. Shift, Command, and Option are all modifier keys. The below shortcut keys are for Mac, but if you substitute Command (⌘) for Control, they should work on Windows as well. Overall ` Make selected panel full-window Timeline Navigation and Controls +/- Adjusts zoom level of timeline. Shift++ and Shift+- Adjust the height of all tracks simultaneously. I/O Mark In, Mark Out ↑ ↓ Navigates between cut points on targeted tracks ⌘ + ← / ⌘ + → Nudge a clip forward or back 1 frame (adding Shift as a modifier moves it 10 frames forward or back) Keyframe Misc ⌘ + Option + K Keyboard Shortcuts 😎 F Matches clip i/o from timeline into the source (newer versions of Premiere require this gets manually set up in shortcuts) Premiere Plugin Directory Premiere Pro Plugins Many of these also work in After Effects , with more advanced functionality. Boris FX Lots of good repair stuff as part of a CONTINUUM license. Boris’ full suite is stellar, too, but it’s expensive to have everything. I can recommend Sapphire for fun FX. Be warned : performance aint great for these plugins on Apple Silicone M1/M2 (as of 2024) vs. the same plugins in After Effects. Digital Anarchy's Flicker Free Helps repair media that has rolling refresh bands due to incompatible shutter speeds and frame rate combinations with non-continuous lighting sources like CFL bulbs or projection lamps. This doesn't fix all the problems, but it does fix many many of them. Highly recommended. This plug has been around for a decade and sometimes works magic, and other times, doesn’t. Shot a concert at 120fps and 1/120.3 and it took care of it. Doesn’t do as good of a job with rolling refresh bands (like on an LED screen or in projection). A good reminder to : ALWAYS CHECK YOUR FOOTAGE! Knights of the Editing Table : Excalibur A $120 plugin that allows you turn pretty much anything into a key-command. Works like SPOTLIGHT but within Premiere. #1 must have IMHO. Like FX Console, but for Premiere. Mister Horse Used to be a buy once and occasionally pay to upgrade. Now it’s a subscription model. Great motion plug for AE (and Premiere). Can recommend a few different plugins. The text one, the background one, the shapes one, the transition one. Neat Video Reduce Noise A plugin that reduces noises very well. Best in class for noise reduction. Red Giant / Maxon Many different tools, below are some of my favorites. Colorista Color Correction suite Magic Bullet / Looks Color and looks effect chain suite. Gateway drug. Primatte Green screen / color key tool when Keylight doesn’t get you there Premiere Gotchas Network Drive Won’t Show Up in PR Media Browser You want to link media from a network drive, but it won’t show up in PR media browser. To get around this: Just uncheck “use media browser” and your network drive will show up. Something Isn’t Working That Worked 5 minutes Ago Restart Premiere Adobe Others Some other software that is less used, or is very simple. Adobe Audition Someone should do a write up here. It's a perfectly fine audio editor with some pretty good frequency based noise removal (noise print). Plugins RX 7 PRO (now RX8) - Very good at removing elements of a track. Can be used to make acapellas or instrumentals. Some tracks perform better than others. Can also be used to reduce background noise. InstantDialogueCleaner _ Does exactly what it says to varying degrees of success. Adobe Lightroom I use Lightroom (not classic tho) to store all of my photos and I pay for the 2TB plan as part of my Creative Cloud license (this costs more than the basic). It’s pretty good. I don’t recommend for slightly more complex photo processing (use Lightroom Classic if you want, but really any complexity you can’t achieve in LR, just use Photoshop ). You can still use Bridge for bulk processing - though it doesn’t always work the way you think (as is traditional with Bridge). Like Classic, this better looking Lightroom: You can still copy and paste settings and select which settings you want to copy and paste. Like copy and paste attributes or copy and paste values, etc. Pro-tip: applying those settings to >1 photo simultaneously requires grid view. Bad design. If you have a ton of photos in your sync’d Lightroom library and desire a local copy, there’s a secret Adobe app called Lightroom Downloader . This will download your entire library to a target folder local to your computer (or an external). Note that: Every time you do this, you do the entire library. It doesn’t look for changes or new photos and just backup those for subsequent backups. You need to leave it running, without a restart, until it’s done. Quitting and continuing is unlikely to be successful. Adobe Illustrator I know Illustrator pretty well. Some dumb gotchas over the years. Here are some of them. SVGs from AI Vectors Are Ragged So you’ve got a final logo in Illustrator and every time you export it to SVG, the path is distorted with little spikes? EASY fix. Note the decimal places changed to “3”. Congratulations! Fixed. Source . Google Sheets Formula Hot Sheet Formula HotSheet I’ve been using Excel / Google Sheets since 2002 or so. This isn’t a breakdown of the basics, but rather, a place where I dump more complex formulas for reference later. Some Low-Hanging-Fruit Here’s a formula that tells you what the date is today =today() Here’s a formula that calculates the days between two dates (where E5 is date 1, and E4 is date 2) =DAYS(E5,E4) Here’s a that will concat a separate date & time field, and keep it formatted as you desire =TEXT(B12, "M/DD/YYYY")&" "&TEXT(C12, "h:mmam/pm") Concatenating more than one date and/or time requires using the TEXT function, otherwise you’ll end up with numbers that don’t mean anything to you. Timecode These formulas will take 00:00:00:00 formatted timecode 30fps or 60fps timecode and convert it to frame count (where cell B5 = timecode) or perform calculations or convert from frame count back to formatted timecode. Note, these only work for WHOLE FRAME timecode (eg, 23.976 won’t work). 30fps =SUM(SUM(SUM(MID(B5, 4,2)*60)+SUM(MID(B5,7,2)*1))*30,N("FPS"))+SUM(RIGHT(B5,2)*1) Where B2 = FPS cell and A2:A is a range of timecode to add - =SUMPRODUCT(IFERROR(SPLIT(A2:A,":")*{B2*3600,B2*60,B2,1})) 60fps =SUM(SUM(SUM(MID(B5, 4,2)*60)+SUM(MID(B5,7,2)*1))*60,N("FPS"))+SUM(RIGHT(B5,2)*1) Where B2 = FPS cell and A2:A is a range of timecode to add - =SUMPRODUCT(IFERROR(SPLIT(A2:A,":")*{B2*3600,B2*60,B2,1})) Converting Frame Count Duration (eg "156") Into formatted timecode . Where C2 = total frame count and B2 = FPS =TEXT(TIME(0,0,C2/B2),"hh:mm:ss") &":"& TEXT(MOD(C2,B2),"00") Performing a Timecode Calculation from formatted timecode (math happens over frame counts), then converting it back to proper timecode format. Where B2 = FPS, A2:A = Range =TEXT(TIME(0,0,SUMPRODUCT( IFERROR(SPLIT(A2:A,":")*{B2*3600,B2*60,B2,1}) )/B2),"hh:mm:ss") &":"&TEXT(MOD(SUMPRODUCT(RIGHT(A2:A,2)),B2),"00") Automatic Population Based on IF Here’s a formula that will automatically populate a cell with whatever’s furthest to the right in a column (from column C through column ZZ, row 4) =ArrayFormula((IFERROR(LOOKUP( 2, 1 / ( C4:ZZ4 <> "" ), C4:ZZ4 ),""))) Here’s a formula that will automatically populate a cell with a most recent date from a header row if the array’s data row contains text. The 5th row is the dat e row. The 7th row is the dat a row. =ArrayFormula(IFERROR(LOOKUP(2,1/(G7:Z7>0),$G$5:$Z$5),"None")) Conditional Formatting Oddly, you need to apply absolute cell references (either column or row, depending on formula goal) if you want conditional formatting to copy and paste and stay relational, you apply the absolute technique. This will keep things relational in a conditional formatting copy/paste. This will apply conditional formatting if the referenced cell (A1) contains the word “Cat”. Literally, if A1 contains “Cat”, then toggle on, else toggle off: =if(regexmatch($A1,"Cat"),1,0) This will apply conditional formatting if the referenced cell (A1) contains the word “someword” where “someword” is case sensitive =if(REGEXMATCH($A1,"(?i).*someword.*"),1,0) This will apply conditional formatting in a cell if the reference cell is checked (using the inserted checkbox function). In this example, this applied in cell E7. So if D7 is checked, E7 will follow the conditional formatting rule. =IF($D7,1,0) This will apply conditional formatting in a cell if the reference cell is checked (using the inserted checkbox function). In this example, this applied in cell E7. So if D7 is checked, E7 will follow the conditional formatting rule. =IF($D7,1,0) This will do the exact same thing, with different syntax: =$D7=TRUE This set of conditional format will apply based on the number of days ago, where $E7 represents the target cell (self). This conditional format can be copied and applied to a range without changing the formula. The first time you put it in it needs to refer to the correct cell, but then will work from there. Applies conditional formatting if the current cell date is between 0 and 6 days ago =IF((((DAYS($E7, TODAY()))>=-6)*((DAYS($E7, TODAY()))<=0))=1,1,0) Applies conditional formatting if the current cell date is between 7 and 13 days ago =IF((((DAYS($E7, TODAY()))>=-13)*((DAYS($E7, TODAY()))<=-7))=1,1,0) Applies conditional formatting if the current cell date is between 14 and 20 days ago =IF((((DAYS($E7, TODAY()))>=-20)*((DAYS($E7, TODAY()))<=-14))=1,1,0) Applies conditional formatting if the current cell date is more than 20 days ago =IF(DAYS($E7, TODAY())<-21,1,0) This will apply conditional formatting to the most recent date as a header row. The first cell reference here has to be the first cell in the range (eg G5) and it applies to all of row 5. =G5=MAX($5:$5) Google Sheets How-To Need Leading Zeros? Set number format to “custom number format” and enter the number of zeros for the number of digits you need. For example, a custom number format of “00” will turn “1” into “01” and “14” will just stay “14”. You can also this in formula by saying =TEXT(SomeCell,”0000”) . If some Cell is B6 and B6 = 16, than that formula will return 0016. Need Unique Row IDs? This took a surprising amount of effort. If you’ve got a note tracker or just need to create unique IDs for rows that persist through a sort or a filter or an insert of rows, and you don’t it to get all wonky, follow the steps below First , put a head in A1 called “Computed IDs”, then put a formula in A2 that counts all of the existing IDs and then adds ONE. It’s looking for the last portion of an ID string that is always the same number of digits (alpha/numeric). The first note would come with an ID that looks like this: [240212-0001] You’ll need to populate one row with the first ID for the formula to work from there. Here’s the formula to put in A2 =TEXT(TODAY(),"YYMMDD")&"-"&TEXT((MAX(ArrayFormula(VALUE(MID(A3:A,9,4))))+1),"0000") It is recommended that you delete all unused rows before you proceed to next steps, otherwise you’ll generate 1000 ids on blank rows. Second , in Apps Script (Extensions→Apps Script) create a new script called MakeIDs.gs This script will print whatever’s in cell A2 down all of column A. It will never repeat a number or replace an existing ID. It does this through a LOOP, so it does one empty row, then another, etc. The only time it will reuse a number is when you delete the last renaming number (because it no longer exists, it doesn’t know that it used to exist). It will put that value in brackets. You can change that very easily to be in a different cell or remove the brackets entirely. function MakeIDs() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var valueToCopy = "[" + sheet.getRange("A2").getValue() + "]"; // Adding "[" at the beginning and "]" at the end var columnAValues = sheet.getRange("A3:A").getValues(); // Adjusted range to start from A3 var i = 0; while (i < columnAValues.length) { if (columnAValues[i][0] === "") { sheet.getRange(i + 3, 1).setValue(valueToCopy); // Adjusted row index to match starting row break; // Exit loop after copying to the first empty cell in column A } i++; } if (i === columnAValues.length) { // All cells in column A are populated, stop the function return; } else { // Call the function recursively to continue copying until all cells are populated MakeIDs(); } } Third You want to create a way to run this command, so create another script in Apps Script called “FillMenu” (you can change ‘CustomMenu’ to whatever name you want). function onOpen() { var spreadsheet = SpreadsheetApp.getActive(); var menuItems = [ {name: 'Make IDs', functionName: 'MakeIDs'}, ]; spreadsheet.addMenu('CustomMenu', menuItems); } Now, refresh the Google Sheet in your web browser and a new menu item will come up called CustomMenu and a command called MakeIDs. Run it and watch your cells populate with new numbers. Add more rows, click it again. Huzzah! Google Sheets - Super Menu w/ Apps Script Add a sweet fuckin' menu in Google Sheets that will shave off hours of your life. After all, time is the only resource you can never get back. Replace fill color (replaceFillColor) - Finds all cells with hex color and replaces the hex color of your choosing Select matching cells (selectMatchingCells) - This one is so tight, you can find all cells that match certain conditions and bulk edit them. Copy (Formula Safe) - this copies formats and formulas of a selection Paste (Formula Safe) - this copies formats and formulas of a selection, formulas references are absolute and aren't transposed (unless they are referenced within the copied selection, and then the self-reference updates). You're welcome!!! Here's the Apps Script /** * Tech Almanac Tools — utilities under a sub menu: * 1. Replace fill color (replaceFillColor) * 2. Select matching cells (selectMatchingCells) * 3. Copy (Formula Safe) - this copies formats and formulas of a selection * 4. Paste (Formula Safe) - this copies formats and formulas of a selection, formulas references are absolute and aren't transposed (unless they are referenced within the copied selection, and then the self-reference updates). You're welcome!!! * "Select matching cells" needs a companion HTML file named "MatchDialog". */ function onOpen() { SpreadsheetApp.getUi() .createMenu('Tech Almanac Tools') .addItem('Replace fill color…', 'replaceFillColor') .addItem('Select matching cells…', 'selectMatchingCells') .addSeparator() .addItem('Copy (formula-safe)', 'formulaSafeCopy') .addItem('Paste (formula-safe)', 'formulaSafePaste') .addToUi(); } /* ============================================================ * TOOL 1 — Replace fill color * ============================================================ */ function replaceFillColor() { const ui = SpreadsheetApp.getUi(); const sheet = SpreadsheetApp.getActiveSheet(); const findResp = ui.prompt( 'Replace fill color', 'Color to FIND (hex, e.g. #cfecff):', ui.ButtonSet.OK_CANCEL ); if (findResp.getSelectedButton() !== ui.Button.OK) return; const findColor = normalizeHex(findResp.getResponseText()); if (!findColor) { ui.alert('That doesn\'t look like a valid hex color. Try something like #cfecff.'); return; } const replaceResp = ui.prompt( 'Replace fill color', 'Color to REPLACE it with (hex, e.g. #ffffff):', ui.ButtonSet.OK_CANCEL ); if (replaceResp.getSelectedButton() !== ui.Button.OK) return; const replaceColor = normalizeHex(replaceResp.getResponseText()); if (!replaceColor) { ui.alert('That doesn\'t look like a valid hex color. Try something like #ffffff.'); return; } const range = sheet.getDataRange(); const backgrounds = range.getBackgrounds(); const startRow = range.getRow(); const startCol = range.getColumn(); const matchedA1 = []; for (let r = 0; r < backgrounds.length; r++) { for (let c = 0; c < backgrounds[r].length; c++) { if (backgrounds[r][c].toLowerCase() === findColor) { backgrounds[r][c] = replaceColor; matchedA1.push(sheet.getRange(startRow + r, startCol + c).getA1Notation()); } } } if (matchedA1.length === 0) { ui.alert('No cells with fill ' + findColor + ' found on "' + sheet.getName() + '".'); return; } sheet.setActiveRangeList(sheet.getRangeList(matchedA1)); const confirm = ui.alert( 'Confirm replacement', 'Found ' + matchedA1.length + ' cell(s) with ' + findColor + ' on "' + sheet.getName() + '".\n\nReplace their fill with ' + replaceColor + '?', ui.ButtonSet.OK_CANCEL ); if (confirm !== ui.Button.OK) return; range.setBackgrounds(backgrounds); SpreadsheetApp.getActive().toast('Replaced ' + matchedA1.length + ' cell(s).', 'Done', 5); } /** * Normalize a user-entered hex string to lowercase 6-digit form (#rrggbb). * Accepts "#cfecff", "cfecff", "#abc", "abc". Returns null if invalid. */ function normalizeHex(input) { if (!input) return null; let h = input.trim().toLowerCase().replace(/^#/, ''); if (/^[0-9a-f]{3}$/.test(h)) { h = h.split('').map(function (ch) { return ch + ch; }).join(''); } if (/^[0-9a-f]{6}$/.test(h)) return '#' + h; return null; } /* ============================================================ * TOOL 2 — Select matching cells * ============================================================ */ function selectMatchingCells() { const html = HtmlService.createHtmlOutputFromFile('MatchDialog') .setWidth(320) .setHeight(460); SpreadsheetApp.getUi().showModalDialog(html, 'Select matching cells'); } /** Called by the dialog on load, to show which cell is the reference. */ function getActiveCellAddress() { const sheet = SpreadsheetApp.getActiveSheet(); return sheet.getName() + '!' + sheet.getActiveCell().getA1Notation(); } /** * Called by the dialog. `options` is an object of booleans keyed by attribute. * Selects every cell on the active sheet that matches the reference cell on * all enabled attributes. Returns { count } or { error }. */ function runMatch(options) { const sheet = SpreadsheetApp.getActiveSheet(); const range = sheet.getDataRange(); const startRow = range.getRow(); const startCol = range.getColumn(); const numRows = range.getNumRows(); const numCols = range.getNumColumns(); // Reference cell position relative to the data range. const active = sheet.getActiveCell(); let refR = active.getRow() - startRow; let refC = active.getColumn() - startCol; if (refR < 0 || refC < 0 || refR >= numRows || refC >= numCols) { return { error: 'Select a cell that contains data first, then run this again.' }; } // Read only the attribute matrices we actually need. const data = {}; if (options.background) data.background = range.getBackgrounds(); if (options.fontColor) data.fontColor = range.getFontColors(); if (options.fontWeight) data.fontWeight = range.getFontWeights(); if (options.fontStyle) data.fontStyle = range.getFontStyles(); if (options.fontFamily) data.fontFamily = range.getFontFamilies(); if (options.fontSize) data.fontSize = range.getFontSizes(); if (options.numberFormat) data.numberFormat = range.getNumberFormats(); if (options.hAlign) data.hAlign = range.getHorizontalAlignments(); if (options.vAlign) data.vAlign = range.getVerticalAlignments(); if (options.wrap) data.wrap = range.getWraps(); const hasAttr = Object.keys(data).length > 0; if (!hasAttr && !options.merge) { return { error: 'Pick at least one condition to match on.' }; } // Build merge maps: dimensions string per cell + which cells are anchors. const mergeDims = []; const isAnchor = []; for (let r = 0; r < numRows; r++) { mergeDims[r] = new Array(numCols).fill('1x1'); isAnchor[r] = new Array(numCols).fill(true); } const merges = range.getMergedRanges(); merges.forEach(function (m) { const mr = m.getRow() - startRow; const mc = m.getColumn() - startCol; const rows = m.getNumRows(); const cols = m.getNumColumns(); const dim = rows + 'x' + cols; for (let r = mr; r < mr + rows; r++) { for (let c = mc; c < mc + cols; c++) { if (r >= 0 && c >= 0 && r < numRows && c < numCols) { mergeDims[r][c] = dim; isAnchor[r][c] = (r === mr && c === mc); } } } // Snap the reference to its merge anchor if it sits inside this merge. if (refR >= mr && refR < mr + rows && refC >= mc && refC < mc + cols) { refR = mr; refC = mc; } }); // Reference values. const ref = {}; Object.keys(data).forEach(function (k) { ref[k] = norm(k, data[k][refR][refC]); }); const refMerge = mergeDims[refR][refC]; // Scan and collect anchor cells that match on every enabled attribute. const matched = []; for (let r = 0; r < numRows; r++) { for (let c = 0; c < numCols; c++) { if (!isAnchor[r][c]) continue; // skip interior cells of merges let ok = true; for (const k in data) { if (norm(k, data[k][r][c]) !== ref[k]) { ok = false; break; } } if (ok && options.merge && mergeDims[r][c] !== refMerge) ok = false; if (ok) matched.push(sheet.getRange(startRow + r, startCol + c).getA1Notation()); } } if (matched.length === 0) return { count: 0 }; sheet.setActiveRangeList(sheet.getRangeList(matched)); return { count: matched.length }; } /** Normalize values so equivalent formats compare equal (colors are case-folded). */ function norm(key, val) { if (key === 'background' || key === 'fontColor') return String(val).toLowerCase(); return val; } // ── Formula-Safe Copy ──────────────────────────────────────────────────────── function formulaSafeCopy() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const range = sheet.getActiveRange(); // Store the A1 notation and sheet name in script properties const props = PropertiesService.getScriptProperties(); props.setProperty('FSC_RANGE', range.getA1Notation()); props.setProperty('FSC_SHEET', sheet.getName()); SpreadsheetApp.getUi().alert( `Copied ${range.getA1Notation()} — now select your destination cell and run Paste (formula-safe).` ); } // ── Formula-Safe Paste ─────────────────────────────────────────────────────── function formulaSafePaste() { const ui = SpreadsheetApp.getUi(); const props = PropertiesService.getScriptProperties(); const srcRangeNotation = props.getProperty('FSC_RANGE'); const srcSheetName = props.getProperty('FSC_SHEET'); if (!srcRangeNotation || !srcSheetName) { ui.alert('Nothing copied yet — run Copy (formula-safe) first.'); return; } const ss = SpreadsheetApp.getActiveSpreadsheet(); const srcSheet = ss.getSheetByName(srcSheetName); const srcRange = srcSheet.getRange(srcRangeNotation); // Grab formulas (as strings) and display values separately const formulas = srcRange.getFormulas(); // raw formula strings, e.g. "=A1+B1" const values = srcRange.getDisplayValues(); // what the cell shows if not a formula // Source range bounds const srcRow = srcRange.getRow(); const srcCol = srcRange.getColumn(); const srcRows = srcRange.getNumRows(); const srcCols = srcRange.getNumColumns(); // Destination anchor const dest = ss.getActiveSheet().getActiveRange(); const destRow = dest.getRow(); const destCol = dest.getColumn(); // Row/col offset from source to destination const rowOffset = destRow - srcRow; const colOffset = destCol - srcCol; // Regex matches cell addresses like B4, $B$4, B$4, $B4 const cellRef = /(\$?)([A-Za-z]{1,3})(\$?)(\d+)/g; /** * If the address falls within the source range, shift it by the paste offset. * Anchored ($) axes are never shifted, matching normal paste behaviour. * Addresses outside the source range are left untouched. */ function shiftIfInRange(colAnchor, colLetter, rowAnchor, rowNum) { const col = columnLetterToIndex(colLetter.toUpperCase()); const row = parseInt(rowNum, 10); if (row >= srcRow && row < srcRow + srcRows && col >= srcCol && col < srcCol + srcCols) { const newCol = colAnchor ? col : col + colOffset; const newRow = rowAnchor ? row : row + rowOffset; return (colAnchor ? '$' : '') + columnIndexToLetter(newCol) + (rowAnchor ? '$' : '') + newRow; } return (colAnchor ? '$' : '') + colLetter.toUpperCase() + (rowAnchor ? '$' : '') + rowNum; } // Build payload: rewrite intra-range references, pass external refs through as-is const payload = formulas.map((row, r) => row.map((formula, c) => { if (formula === '') return values[r][c]; return formula.replace(cellRef, (match, ca, cl, ra, rn) => shiftIfInRange(ca, cl, ra, rn) ); }) ); const destRange = ss.getActiveSheet().getRange( destRow, destCol, payload.length, payload[0].length ); // Copy formatting first, then overwrite with values/formulas srcRange.copyTo(destRange, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); destRange.setValues(payload); } // ── Helpers ────────────────────────────────────────────────────────────────── function columnLetterToIndex(letters) { let n = 0; for (let i = 0; i < letters.length; i++) { n = n * 26 + (letters.charCodeAt(i) - 64); } return n; } function columnIndexToLetter(n) { let s = ''; while (n > 0) { const rem = (n - 1) % 26; s = String.fromCharCode(65 + rem) + s; n = Math.floor((n - 1) / 26); } return s; } Here's the MarchDialog.html for the Select Matching Cells Modal