> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 CSV 的动态内容

> 在 OneSignal 中使用 CSV 上传和 Liquid 语法，大规模个性化推送、电子邮件和短信消息。

OneSignal 提供多种方式来大规模[个性化消息内容](./message-personalization)。本指南重点介绍在 OneSignal 控制面板中使用动态内容与 CSV 上传功能，适用于推送、邮件和短信。

**主要优势：**

* **使用 CSV 大规模个性化** – 一条消息，为每个人提供定制体验
* **多语言支持** – 根据用户自动切换语言
* **动态个性化** – 内容根据用户属性（语言、地区、营销活动 ID）进行调整
* **团队协作** – 非技术用户在 CSV 文件中编辑内容
* **HTML 注入（邮件）** – 在 CSV 单元格中包含 HTML 标记，以动态构建丰富的邮件内容
* **跨渠道兼容性** – 跨渠道重用 CSV 逻辑

**常见用例：**

* 多语言引导或营销
* 特定地区的促销活动
* 按位置发布活动通知
* 基于营销活动的个性化

***

## 使用 CSV 的动态内容设置步骤

**快速参考：**

1. 创建包含内容变化的 CSV 文件。
2. 使用 Liquid 语法中的 `dynamic_content` 属性将 CSV 数据映射到消息。
3. 从 OneSignal 控制面板创建新消息或[模板](./templates)。
4. 选择**动态内容**或**个性化**按钮。
5. 上传 CSV 文件并发送消息。

### CSV 要求和设置

* **文件大小：** 小于 200 KB
* **列标题：**
  * 为标签键保留第一列标题，或留空以引用部分
  * 仅限字母数字字符和下划线
  * 使用下划线（`_`）代替空格
* **编码：** UTF-8

从空白 CSV 开始或使用提供的模板。在消息和模板编辑器中选择**动态内容**或**个性化**按钮时会提供模板。

<Frame caption="在消息编辑器中找到的动态内容按钮。">
  <img src="https://mintcdn.com/onesignal/jBdBk5XvQR5eKOks/images/docs/772f91e24ebca83a05d4e96819a41ec58d5ca0acd3a715e971c4a43ba7654494-Screenshot_2025-02-10_at_5.23.32_PM.png?fit=max&auto=format&n=jBdBk5XvQR5eKOks&q=85&s=c51a6fcb07f7aab797cbfe74423530cb" alt="OneSignal 消息编辑器中的动态内容按钮" width="1960" height="380" data-path="images/docs/772f91e24ebca83a05d4e96819a41ec58d5ca0acd3a715e971c4a43ba7654494-Screenshot_2025-02-10_at_5.23.32_PM.png" />
</Frame>

可用模板：

* **多语言** – 按语言本地化内容
* **内容个性化** – 按数据标签自定义内容

<Frame caption="OneSignal 控制面板中的 CSV 模板选项。">
  <img src="https://mintcdn.com/onesignal/YOTSrtBSoqdrJ37A/images/docs/47f48b79aa100bd5d2c59a418216bafba75daaa92d0bf939dcd3ccceca39cd7c-Screenshot_2025-02-10_at_5.26.15_PM.png?fit=max&auto=format&n=YOTSrtBSoqdrJ37A&q=85&s=87947eb40093580c8589cf7eb4183564" alt="显示多语言和内容个性化模板的 CSV 模板选项" width="1986" height="870" data-path="images/docs/47f48b79aa100bd5d2c59a418216bafba75daaa92d0bf939dcd3ccceca39cd7c-Screenshot_2025-02-10_at_5.26.15_PM.png" />
</Frame>

#### CSV 示例

本指南将使用以下示例 CSV 数据。

<Tabs>
  <Tab title="多语言模板示例">
    * 将列标题映射到您的[支持的语言代码](./multi-language-messaging#supported-languages)。
    * 为每种语言代码在每行中添加您的翻译。
    * 如果您有多个部分（如在邮件中），请将第一列指定为部分名称。

    此示例包括：

    * 3 种语言：英语、西班牙语和法语。
    * 2 个部分："section\_1" 和 "section\_2"。

    <Frame caption="多语言 CSV 将用户语言属性与内容匹配（类似于 VLOOKUP）。">
      <img src="https://mintcdn.com/onesignal/0qspEXXeJ8zJbkJ-/images/docs/8716e43deead16759c2500d85900d2d1be8b6a9c51e0477160569b05534a58fb-Screenshot_2025-02-10_at_8.37.25_PM.png?fit=max&auto=format&n=0qspEXXeJ8zJbkJ-&q=85&s=4a20651cf2949bad117b8a9fda432536" alt="以语言代码为列标题、翻译内容为行的多语言 CSV" width="1438" height="220" data-path="images/docs/8716e43deead16759c2500d85900d2d1be8b6a9c51e0477160569b05534a58fb-Screenshot_2025-02-10_at_8.37.25_PM.png" />
    </Frame>
  </Tab>

  <Tab title="内容个性化模板示例">
    * 将第一列标题映射到标签键，将基础行映射到您想要引用的值。有关向用户添加标签的更多信息，请参阅[标签](./add-user-data-tags)。
    * 将其余列标题映射到您想要个性化的部分或组件。

    在此示例中：

    * 标签键为 `campaign_id`，可能的值为 `A` 和 `B`。
    * 有 3 个组件："title"、"message" 和 "url"。

    <Frame caption="使用 campaign_id 数据标签的个性化 CSV。">
      <img src="https://mintcdn.com/onesignal/3zq1PvSaqvUE2bIx/images/docs/2d49628c7c891801e50b7f397442f5887e7b776897d24788be16887ed191f631-Screenshot_2025-04-10_at_9.47.35_AM.png?fit=max&auto=format&n=3zq1PvSaqvUE2bIx&q=85&s=23ec0fe2224cc3103e7a7c62168dd050" alt="使用 campaign_id 标签和 title、message、url 列的内容个性化 CSV" width="1406" height="160" data-path="images/docs/2d49628c7c891801e50b7f397442f5887e7b776897d24788be16887ed191f631-Screenshot_2025-04-10_at_9.47.35_AM.png" />
    </Frame>

    <Warning>
      **重要：** 从 CSV 标题中删除空格和非字母数字字符
      或在 Liquid 中使用哈希记法。
    </Warning>

    <Frame caption="使用 Liquid 语法引用标签的详细 CSV 示例。">
      <img src="https://mintcdn.com/onesignal/tc0EvmtSSX56SX0c/images/docs/9352ff1-event_translation.csv.png?fit=max&auto=format&n=tc0EvmtSSX56SX0c&q=85&s=e71b92286f500fc201b95bafa2b38a85" alt="显示基于标签个性化的 Liquid 语法引用的详细 CSV 示例" width="3189" height="2646" data-path="images/docs/9352ff1-event_translation.csv.png" />
    </Frame>
  </Tab>
</Tabs>

### 将 CSV 数据映射到消息内容

使用 [Liquid 语法](./using-liquid-syntax)，在消息中使用 `dynamic_content` 属性引用 CSV 数据：

```liquid theme={null}
<!-- 选项 1：先按组件访问 -->
{{dynamic_content.file_name.message_component[user_property]}}

<!-- 选项 2：先按用户属性访问 -->
{{dynamic_content.file_name[user_property].message_component}}
```

**参数：**

* `dynamic_content` – 用于引用 CSV 数据的属性名称
* `file_name` – CSV 文件名（不含 `.csv` 扩展名）
* `message_component` – 您想要个性化的特定消息组件。这是 CSV 列标题或第一行中的静态文本。
* `user_property` – 您想要引用的[用户属性](./message-personalization#properties)。

**后备内容：**

始终使用硬编码字符串 `default` 后备内容，以确保如果 CSV 查找或动态内容失败时消息能够呈现。

```liquid Liquid 语法用于后备 theme={null}
{{ dynamic_content.my_template.header[user.language] | default: "欢迎查看我们的最新更新" }}
```

这意味着如果 CSV 查找或动态内容失败，消息将呈现后备文本 `"欢迎查看我们的最新更新"`。

这确保：

* 可用时使用动态内容
* 如果动态内容失败，显示硬编码消息
* 用户永远不会收到空白内容

<Tabs>
  <Tab title="多语言消息示例">
    ```csv translations.csv theme={null}
    ,en,es,fr
    section_1,Hello,Hola,Bonjour
    section_2,Thanks for shopping with us...,Gracias por comprar con nosotros...,Merci pour votre achat avec nous...
    ```

    * `file_name` 是 `translations.csv`。
    * `message_component` 位于第一列的行中 `section_1` 和 `section_2`。
    * `user_property` 是与语言代码匹配的列标题。我们可以使用 `user.language` [属性](./message-personalization#properties)在用户上引用它。

    ```liquid 多语言消息的基本 Liquid 语法 theme={null}
    {{dynamic_content.translations.section_1[user.language]}}
    {{dynamic_content.translations.section_2[user.language]}}
    ```

    ```liquid （推荐）带默认后备的多语言消息 Liquid 语法 theme={null}
    {% assign supported_langs = "en,es,fr,de" | split: "," %}
    {% assign lang = user.language | default: "en" %}

    {% unless supported_langs contains lang %}
      {% assign lang = "en" %}
    {% endunless %}

    {{ dynamic_content.translations.section_1[lang] | default: "Hello" }}
    {{ dynamic_content.translations.section_2[lang] | default: "Thanks for shopping with us..." }}
    ```

    <Frame caption="为多语言邮件内容添加 Liquid 语法。">
      <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/d0df135475c202308b5b5e40f3893f1beff6d7d387a99e9264c5c5936283d699-Screenshot_2025-02-10_at_10.08.20_PM.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=bb3aaec56a1bcca6e1400b096a5550b7" alt="带有多语言动态内容 Liquid 语法的 OneSignal 邮件编辑器" width="1062" height="446" data-path="images/docs/d0df135475c202308b5b5e40f3893f1beff6d7d387a99e9264c5c5936283d699-Screenshot_2025-02-10_at_10.08.20_PM.png" />
    </Frame>
  </Tab>

  <Tab title="内容个性化消息示例">
    ```csv content_personalization_template.csv theme={null}
    campaign_id,title,message,url
    campaign_123,Flash deal for you,Tap to claim,https://example.com/flash
    campaign_456,Weekend picks are here,See what's trending,https://example.com/weekend
    default,Our latest offers,See what's new,https://example.com
    ```

    * `file_name` 是 `content_personalization_template.csv`。
    * `user_property` 映射到标签键：`campaign_id`。
    * `message_component` 是映射到您想要个性化的消息部分的列标题（title、message 或 url）。

    ```liquid 内容个性化消息的 Liquid 语法 theme={null}
    {{ dynamic_content.content_personalization_template[campaign_id].title }}
    {{ dynamic_content.content_personalization_template[campaign_id].message }}
    {{ dynamic_content.content_personalization_template[campaign_id].url }}
    ```

    ```liquid （推荐）带默认后备的内容个性化消息 Liquid 语法 theme={null}
    {% assign cid = campaign_id | default: "default" %}

    {% unless dynamic_content.content_personalization_template[cid] %}
      {% assign cid = "default" %}
    {% endunless %}

    {{ dynamic_content.content_personalization_template[cid].title | default: "我们的最新优惠" }}
    {{ dynamic_content.content_personalization_template[cid].message | default: "查看新内容" }}
    {{ dynamic_content.content_personalization_template[cid].url | default: "https://example.com" }}
    ```

    <Frame caption="为基于营销活动的推送个性化添加 Liquid 语法。">
      <img src="https://mintcdn.com/onesignal/tNi1OgLc_p9hiq7_/images/docs/1c80cff787617df73a16bd4858446a07db6af84f4d79404c4a2ad34e3e509876-Screenshot_2025-02-10_at_9.53.13_PM.png?fit=max&auto=format&n=tNi1OgLc_p9hiq7_&q=85&s=37a96d318756adc6b0f2a35aecc20c92" alt="动态内容个性化 Liquid 示例" width="1774" height="1018" data-path="images/docs/1c80cff787617df73a16bd4858446a07db6af84f4d79404c4a2ad34e3e509876-Screenshot_2025-02-10_at_9.53.13_PM.png" />
    </Frame>
  </Tab>
</Tabs>

<Check>
  使用带有 `default` 后备的 Liquid 来更新主题行、预标题、按钮
  标签和 URL。
</Check>

### 在 CSV 单元格中使用 HTML（仅限邮件）

您可以在 CSV 单元格中直接包含 HTML 标记，将富内容注入邮件。这对于根据用户属性替换邮件整个部分（如横幅、CTA 或样式块）非常有用。

```csv promo_banners.csv theme={null}
campaign_id,banner_html
spring_sale,<div style="background:#4CAF50;padding:16px;text-align:center;"><a href="https://example.com/spring" style="color:#fff;font-size:18px;">Shop the Spring Sale</a></div>
default,<div style="background:#333;padding:16px;text-align:center;"><a href="https://example.com" style="color:#fff;font-size:18px;">See What's New</a></div>
```

在您的邮件模板中引用 HTML 单元格：

```liquid theme={null}
{{ dynamic_content.promo_banners[campaign_id].banner_html | default: "<p>Check out our latest offers</p>" }}
```

HTML 直接在邮件正文中渲染，因此您可以使用邮件客户端支持的任何内联样式和标记。

<Warning>
  CSV 单元格中的 HTML 仅在邮件中受支持。推送和短信渠道将内容渲染为纯文本，不解析 HTML 标记。
</Warning>

***

## 参考

### 更新模板

通过控制面板重新上传 CSV 或使用[更新模板 API](/reference/update-template) `dynamic_content` 属性。

### 键中的特殊字符

**哈希记法**（用于非字母数字键）：

```liquid theme={null}
{{ dynamic_content.file_name["!the_row!"]["&the_column&"] }}
```

**点记法**（用于标准键）：

```liquid theme={null}
{{ dynamic_content.file_name.the_row.the_column }}
```

***

## 常见问题

### 如何测试使用 CSV 的动态内容？

使用邮件来测试消息的多个变体。

* 在邮件中使用 `+` 地址来测试多个变体：`username+test@example.com`。
* 按照上述多语言和内容个性化示例设置标签。
* 有关上传多个用户和数据标签的更多信息，请参阅[导入](./import)。

### 何时使用动态内容与 CSV vs. 其他个性化选项？

从控制面板发送消息且 CSV 文件中有用户数据时，使用**动态内容与 CSV**。有关向消息添加动态内容的其他方法，请参阅[消息个性化](./message-personalization)或[多语言消息](./multi-language-messaging)。

***

## 相关文章

<Columns cols={2}>
  <Card title="消息个性化" icon="wand-magic-sparkles" href="./message-personalization">
    OneSignal 中所有个性化选项的概述。
  </Card>

  <Card title="使用 Liquid 语法" icon="code" href="./using-liquid-syntax">
    OneSignal 消息的完整 Liquid 语法参考。
  </Card>

  <Card title="导入" icon="file-import" href="./import">
    向 OneSignal 上传用户数据和细分。
  </Card>

  <Card title="模板" icon="clone" href="./templates">
    创建可重用的消息模板。
  </Card>
</Columns>
