TikTok 复制广告组 + 批量换素材建计划
适用场景:用户给一批达人视频链接 + 帖子授权码(#xxxx=),要求参照某条已有广告组复制出 N 条、每条换成对应素材后投放。
典型触发语:「这几个要复制投 XX 的品牌广告,20 美金一天」「你可以直接接管 开始投」「复制这个,改一下日期、达人ID、素材ID」。
一、开场必问清单(在动手前一次问清)
每次需求都不一样,以下 6 项不确认完不要开始操作。用户没说的就问,能从截图/链接推断的先推断再复述确认:
- 复制源:哪条广告组作为母本(拿到完整名称或广告组 ID)
- 副本数量与对应关系:每条副本配哪个达人的哪条视频
- 日预算:金额、日预算还是总预算
- 排期:立即开跑还是定时;长期投放(无结束时间)还是设结束时间
- 系列归属:复制到原系列下还是新建系列
- 素材来源:帖子授权码 / 账号已授权的帖子 / 上传新视频
复制弹窗里的「将副本添加到」默认就是原系列(标「原始」),要放别的系列必须在这一步改,事后改不了。
二、命名规则
从母本名称反推,不要自己发明。KANS 越南的惯例:
广告组:MMDD-达人用户名-产品-BC-人群-视频ID- ← 结尾带短横线
广告 :MMDD-达人用户名-产品-BC-人群-视频ID ← 结尾不带
MMDD= 建计划当天日期,不是母本的日期- 达人用户名 = TikTok 链接里
@后面那段(@yayathao→yayathao) - 视频ID = 链接里
/video/后面那串数字 - 母本名里的产品、
BC、人群部分原样保留
提交前把新旧名称列成对照表让用户确认。
三、操作流程
1. 复制广告组
- 打开
https://ads.tiktok.com/i18n/manage/adgroup?aadvid=<广告账户ID>,切到「广告组」tab - 用 JS 找到母本行(按名称关键字匹配叶子节点),再靠截图定位该行最左侧的勾选框坐标——页面没有原生
input[type=checkbox],JS 查不到,只能看图点 - 勾选后顶部工具条出现「复制」,点开弹窗
- 「副本数量」点
+按钮加到 N(别直接改数字框),随后会出现 N 个名称输入框 - 名称框是 React 受控组件,用坐标逐个清空重打很慢且易错,用 native setter 一次性写入:
function allEls(root,out){out=out||[];for(const e of root.querySelectorAll('*')){out.push(e);if(e.shadowRoot)allEls(e.shadowRoot,out);}return out;}
const ins=allEls(document).filter(e=>e.tagName==='INPUT'&&/副本/.test(e.value||''));
const names=[/* 按顺序 */];
const s=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,'value').set;
ins.forEach((el,i)=>{el.focus();s.call(el,names[i]);
el.dispatchEvent(new Event('input',{bubbles:true,composed:true}));
el.dispatchEvent(new Event('change',{bubbles:true,composed:true}));el.blur();});
- 「不要复制广告」保持不勾选——连广告一起复制,之后换素材比从零建广告省事(文案、CTA、目标页面都能继承)
- 点「复制」→ 自动跳到批量编辑页,左侧树列出 N 个新草稿,每个下挂 1 个广告
2. 逐个广告组:改预算
预算输入框的稳定特征是 placeholder 含「以上」(如 20.00 以上):
const b=allEls(document).find(e=>e.tagName==='INPUT'&&/以上/.test(e.placeholder||''));
b.focus();s.call(b,'20.00');
b.dispatchEvent(new Event('input',{bubbles:true,composed:true}));
b.dispatchEvent(new Event('change',{bubbles:true,composed:true}));b.blur();
校验必须读提示文案,不能只看 input.value(React state 可能没提交):
[...document.querySelectorAll('div')].map(d=>d.innerText||'')
.filter(x=>/每日平均花费为/.test(x)).sort((a,b)=>a.length-b.length)[0]
出现「每日平均花费为 20.00USD」才算写入成功。
3. 素材授权码批量导入(只做一次)
进第一个广告的创意区 →「+ 添加」→「TikTok 帖子」tab →「添加帖子」按钮 → 弹出「授权 TikTok 作品」文本域,一次最多 20 个码,每行一个,把本批全部码一次性粘进去(用 HTMLTextAreaElement 的 native setter),点「继续」→ 确认页点「添加 TikTok 作品」。
导完后这些帖子就进了账号素材库,后面每个广告组直接按视频 ID 搜索即可,不用再走授权码流程。
注意:刚导入的帖子会被默认全部勾选,当前这条广告只要留 1 个,其余要手动取消。取消时一次点一个、点完截图确认「已选择 N 个素材」计数,连点多个会漏。
4. 逐个广告:换素材 + 改广告名
- 左侧树点开广告组的展开箭头 → 点它下面的广告
- 向下滚到创意卡,鼠标悬停才会出现两个图标:
- 铅笔 = 「在视频编辑器中打开」,会开新标签页,不要点
- 垃圾桶 = 删除素材,点这个
- 删除后创意区变成「+ 添加 / + 创建新视频」,点「+ 添加」
- 先截图确认面板已渲染出来再点 tab,面板没开就点会点空、甚至误触后面的页面元素把区块折叠掉
- 切到「TikTok 帖子」tab 后,第一次往搜索框输入经常丢(tab 内容还在加载),输完截图看一眼,空的就补打一次
- 搜索框输入视频 ID → 回车 → 结果只剩一条 → 核对作者名与达人用户名对得上 → 勾选 → 右下角「保存」
- 保存后广告名仍是母本的名字,用 native setter 改成对应新名(广告层级不带结尾短横线)
5. 排期
副本默认继承母本的开始时间,母本如果是定时的,副本也会是未来时间,不会自动变成现在。用户要「立即投放」就必须手动改开始时间。「持续投放广告组」单选已选中即表示无结束时间。
排期日期框是自定义控件,坐标点击容易误触旁边的「展开选项」(会展开分时段面板并让页面跳动)。改之前先截图确认框的实际位置,改完再截图确认。
四、发布前的硬性规则
- 绝不自动点「全部发布」。配置完先出一张对照表(广告组名 / 达人 / 素材作者 / 预算 / 排期)让用户确认,由用户决定谁来点。
- 用户说「停」「我检查」就立刻停手,不再改任何字段,并说清当前停在哪一步、哪些改了哪些没改。
- 页面底部「草稿已保存」说明改动不会丢,可以放心停。
五、发布后验证
回广告组列表页,确认:
- 4 条新广告组都在,状态「审核中」或「已排期」
- 预算列显示正确金额 + 日预算
- 开关是打开状态
- 「共计 N 个广告组」数字 = 原数 + 副本数
把广告组 ID 和名称列表回给用户。
六、常见提示(属正常,不用处理)
- 创意卡上「此 TikTok 帖子中的链接将仅面向以下地域显示:越南。发布后请勿更改锚点,否则可能影响归因」——Spark/BC 帖子的固定提示
- 「1 个创意包含内容警告,可能会影响广告投放」——母本原本就有
- 页面顶部「账户余额预计将在 N 天内用完」——这条要主动提醒用户,并算清新增广告组后每天多烧多少