AutomationFlowsSlack & Telegram › Japanese Document Translation Quality Checker with Deepl & Google Drive to Slack

Japanese Document Translation Quality Checker with Deepl & Google Drive to Slack

Bys3110 @s3110 on n8n.io

Japanese Document Translation Quality Checker with DeepL & Google Drive to Slack

Event trigger★★★★☆ complexity11 nodesGoogle Drive TriggerSlackGoogle DocsDeepLHTTP Request
Slack & Telegram Trigger: Event Nodes: 11 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #10315 — we link there as the canonical source.

This workflow follows the Google Docs → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "MOst08M9BYcBnP4g",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "tags": [],
  "nodes": [
    {
      "id": "60887f7a-e208-4543-be68-da1b53eb31cc",
      "name": "Watch for New Japanese Documents",
      "type": "n8n-nodes-base.googleDriveTrigger",
      "position": [
        -1904,
        880
      ],
      "parameters": {
        "event": "fileCreated",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "specificFolder",
        "folderToWatch": {
          "__rl": true,
          "mode": "id",
          "value": "<__PLACEHOLDER_VALUE__\u76e3\u8996\u5bfe\u8c61\u306eGoogle Drive\u30d5\u30a9\u30eb\u30c0ID__>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e2600bcc-7bb7-4b51-a719-e382cd730cb8",
      "name": "Send Slack Notification",
      "type": "n8n-nodes-base.slack",
      "position": [
        -336,
        880
      ],
      "parameters": {
        "text": "=\ud83d\udd0d Translation Quality Report Ready\n\nFile: {{ $('Generate Diff Analysis').first().json.fileName }}\nQuality Score: {{ (100 - parseFloat($('Generate Diff Analysis').first().json.diffPercentage)).toFixed(2) }}%\nDifferences: {{ $('Generate Diff Analysis').first().json.diffCount }}\n\n\ud83d\udcc4 Report: {{ $json.documentUrl }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.slackChannel }}"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.3
    },
    {
      "id": "f0ed9077-f7f9-49aa-be69-528374839ef6",
      "name": "Create Diff Report in Google Docs",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        -560,
        880
      ],
      "parameters": {
        "title": "={{ 'Translation Quality Report - ' + $json.fileName }}",
        "driveId": "My Drive",
        "folderId": "={{ $('Workflow Configuration').first().json.targetFolder }}"
      },
      "typeVersion": 2
    },
    {
      "id": "0114cd5c-ab38-4aaa-a3b5-fb81e2857921",
      "name": "Generate Diff Analysis",
      "type": "n8n-nodes-base.code",
      "position": [
        -784,
        880
      ],
      "parameters": {
        "jsCode": "const originalText = $('Get Text via Authenticated API Call').first().json.data;\nconst translatedText = $('Translate JP to EN').first().json.text;\nconst backTranslatedText = $('Back-Translate EN to JP').first().json.text;\nconst fileName = $('Watch for New Japanese Documents').first().json.name;\n\n// Simple character-by-character diff\nfunction generateDiff(original, backTranslated) {\n  const maxLen = Math.max(original.length, backTranslated.length);\n  let diffReport = [];\n  \n  for (let i = 0; i < maxLen; i++) {\n    const origChar = original[i] || '';\n    const backChar = backTranslated[i] || '';\n    \n    if (origChar !== backChar) {\n      diffReport.push({\n        position: i,\n        original: origChar,\n        backTranslated: backChar\n      });\n    }\n  }\n  \n  return diffReport;\n}\n\nconst differences = generateDiff(originalText, backTranslatedText);\nconst diffPercentage = ((differences.length / Math.max(originalText.length, backTranslatedText.length)) * 100).toFixed(2);\n\nreturn [{\n  json: {\n    fileName,\n    originalText,\n    translatedText,\n    backTranslatedText,\n    differences,\n    diffCount: differences.length,\n    diffPercentage,\n    summary: `Translation quality: ${100 - diffPercentage}% match between original and back-translation`\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "f7b745b2-d348-4d90-8c36-b7d2cb6d1523",
      "name": "Back-Translate EN to JP",
      "type": "n8n-nodes-base.deepL",
      "position": [
        -1008,
        880
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "translateTo": "JA",
        "additionalFields": {
          "sourceLang": "EN"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "01968967-b19f-43f9-ab7b-52df76afccc3",
      "name": "Translate JP to EN",
      "type": "n8n-nodes-base.deepL",
      "position": [
        -1232,
        880
      ],
      "parameters": {
        "text": "={{ $('Get Text via Authenticated API Call').first().json.data }}",
        "translateTo": "EN-US",
        "additionalFields": {
          "sourceLang": "JA"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "18637617-7c71-4f0c-af19-eb9c726b87f7",
      "name": "Workflow Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        -1680,
        880
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "targetFolder",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Google Drive folder ID for storing diff reports__>"
            },
            {
              "id": "id-2",
              "name": "slackChannel",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Slack channel ID or name (e.g., #translations)__>"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "0421a90b-61dd-44ff-a3d4-6c6edeac2870",
      "name": "Get Text via Authenticated API Call",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1456,
        880
      ],
      "parameters": {
        "url": "=https://www.googleapis.com/drive/v3/files/{{ $('Watch for New Japanese Documents').first().json.id }}/export?mimeType=text/plain",
        "options": {},
        "sendHeaders": true,
        "authentication": "predefinedCredentialType",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{$credentials.googleDriveOAuth2Api.accessToken}}"
            }
          ]
        },
        "nodeCredentialType": "googleDriveOAuth2Api"
      },
      "typeVersion": 4.1
    },
    {
      "id": "7ec9dad8-5ef7-4639-b2ef-ec2b8acbbe61",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2736,
        624
      ],
      "parameters": {
        "width": 768,
        "height": 960,
        "content": "## Who\u2019s it for\n\nTeams that translate Japanese documents and want an automatic, objective signal when quality drops\u2014localization leads, QA reviewers, and operations teams.\n\n## What it does / How it works\n\nWhen a new Japanese file lands in a specific Google Drive folder, the workflow exports the text, translates it JA \u2192 EN (DeepL), back-translates EN \u2192 JA, then compares original vs. back-translation to estimate a quality score. It writes a Google Docs report and posts a Slack notification with the score and diffs.\n\n### \u5177\u4f53\u4f8b\n\n#### \u54c1\u8cea\u30b9\u30b3\u30a2\u306e\u8a08\u7b97\u65b9\u6cd5\n\u54c1\u8cea\u30b9\u30b3\u30a2\u306f\u3001\u5143\u306e\u65e5\u672c\u8a9e\u30c6\u30ad\u30b9\u30c8\u3068\u3001\u82f1\u8a9e\u306b\u7ffb\u8a33\u3057\u305f\u5f8c\u306b\u518d\u5ea6\u65e5\u672c\u8a9e\u306b\u300c\u9006\u7ffb\u8a33\u300d\u3057\u305f\u30c6\u30ad\u30b9\u30c8\u3092\u6bd4\u8f03\u3057\u3001\u305d\u306e\u4e00\u81f4\u7387\u3092\u30d1\u30fc\u30bb\u30f3\u30c6\u30fc\u30b8\u3067\u793a\u3057\u307e\u3059\u3002\n\n**\u8a08\u7b97\u5f0f:**\n`\u54c1\u8cea\u30b9\u30b3\u30a2 = 100 - (\u5dee\u7570\u6587\u5b57\u6570 / \u5168\u6587\u5b57\u6570 * 100)`\n\n**\u4f8b:**\n- **\u5143\u306e\u30c6\u30ad\u30b9\u30c8:** `\u4eca\u65e5\u306f\u826f\u3044\u5929\u6c17\u3067\u3059` (8\u6587\u5b57)\n- **\u9006\u7ffb\u8a33\u30c6\u30ad\u30b9\u30c8:** `\u4eca\u65e5\u306f\u826f\u3044\u5929\u6c17\u3060` (8\u6587\u5b57)\n- \u6700\u5f8c\u306e\u300c\u3059\u300d\u3068\u300c\u3060\u300d\u304c\u7570\u306a\u308b\u305f\u3081\u3001\u5dee\u7570\u6587\u5b57\u6570\u306f `1` \u3067\u3059\u3002\n- **\u5dee\u7570\u306e\u5272\u5408:** `(1 / 8) * 100 = 12.5%`\n- **\u54c1\u8cea\u30b9\u30b3\u30a2:** `100 - 12.5 = 87.5%`\n\n#### \u30ec\u30dd\u30fc\u30c8\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\n\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306f\u3001Google\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u3001Slack\u3067\u901a\u77e5\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002\n\n**Slack\u901a\u77e5\u306e\u4f8b:**\n```\n\ud83d\udd0d Translation Quality Report Ready\n\nFile: monthly_report_JP.docx\nQuality Score: 87.50%\nDifferences: 1\n\n\ud83d\udcc4 Report: https://docs.google.com/document/d/...\n```\n\n**Google\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u30ec\u30dd\u30fc\u30c8\u4f8b:**\n- **\u30bf\u30a4\u30c8\u30eb:** `Translation Quality Report - monthly_report_JP.docx`\n- **\u5185\u5bb9:**\n    - **\u30d5\u30a1\u30a4\u30eb\u540d:** `monthly_report_JP.docx`\n    - **\u54c1\u8cea\u30b9\u30b3\u30a2:** `87.50%`\n    - **\u5dee\u7570\u306e\u6570:** `1`\n    - ---\n    - **\u5143\u306e\u30c6\u30ad\u30b9\u30c8\uff08JP\uff09:** `\u4eca\u65e5\u306f\u826f\u3044\u5929\u6c17\u3067\u3059`\n    - **\u9006\u7ffb\u8a33\u30c6\u30ad\u30b9\u30c8\uff08JP\uff09:** `\u4eca\u65e5\u306f\u826f\u3044\u5929\u6c17\u3060`\n    - **\u4e2d\u9593\u7ffb\u8a33\uff08EN\uff09:** `Today the weather is good`\n\n## How to set up\n\n1. Connect Google Drive, DeepL, Slack credentials.\n2. Point the Google Drive Trigger to your \u201cincoming JP docs\u201d folder.\n3. In **Workflow Configuration** (Set node), fill `targetFolder` (for reports) and `slackChannel`.\n4. Run once manually, then activate.\n5. Drop a JP doc (Google Docs / exportable) into the watched folder to test.\n\n## Requirements\n\n* n8n (self-hosted or Cloud)\n* Google Drive, DeepL, Slack credentials\n* A Drive folder for incoming JP docs + a folder for reports"
      },
      "typeVersion": 1
    },
    {
      "id": "e0bd2b2d-cb01-4d1e-8ae8-be21c7479335",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -976,
        1072
      ],
      "parameters": {
        "color": 7,
        "width": 768,
        "height": 176,
        "content": "### Troubleshooting\n\n* **URL validation / 403** \u2192 Reconnect Drive OAuth and confirm export scopes.\n* **Empty text** \u2192 Confirm file is Google Docs or exportable MIME.\n* **Slack not posting** \u2192 Check `slackChannel` value and app channel permission.\n* **DeepL errors** \u2192 Verify quota, region, and credentials binding in n8n.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "a1b2c3d4-e5f6-4g7h-8i9j-k0l1m2n3o4p5",
      "name": "Sticky Note - Advanced",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -976,
        1344
      ],
      "parameters": {
        "color": 2,
        "width": 768,
        "height": 416,
        "content": "### \u2728 \u9ad8\u5ea6\u306a\u8a2d\u5b9a\u3068\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\n\n- **\u7ffb\u8a33\u30a8\u30f3\u30b8\u30f3\u306e\u5909\u66f4:**\nDeepL\u30ce\u30fc\u30c9\u3092Google Translate\u306a\u3069\u4ed6\u306e\u7ffb\u8a33\u30b5\u30fc\u30d3\u30b9\u30ce\u30fc\u30c9\u306b\u7f6e\u304d\u63db\u3048\u53ef\u80fd\u3067\u3059\u3002API\u30ad\u30fc\u7b49\u306e\u8a8d\u8a3c\u60c5\u5831\u3092\u9069\u5207\u306b\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n- **\u5dee\u5206\u5206\u6790\u30ed\u30b8\u30c3\u30af\u306e\u5f37\u5316:**\n\u73fe\u5728\u306e\u300cGenerate Diff Analysis\u300d\u30ce\u30fc\u30c9\u306f\u6587\u5b57\u5358\u4f4d\u306e\u6bd4\u8f03\u3067\u3059\u3002\u30b3\u30fc\u30c9\u3092\u7de8\u96c6\u3057\u3001\u5358\u8a9e\u5358\u4f4d\u306e\u6bd4\u8f03\uff08`diff`\u30e9\u30a4\u30d6\u30e9\u30ea\u7b49\u3092\u5229\u7528\uff09\u3084\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u81ea\u7136\u8a00\u8a9e\u51e6\u7406\u3092\u7d44\u307f\u8fbc\u3080\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002\n\n- **\u901a\u77e5\u30c1\u30e3\u30cd\u30eb\u306e\u8ffd\u52a0:**\nSlack\u30ce\u30fc\u30c9\u306e\u5f8c\u308d\u306b\u30e1\u30fc\u30eb\u9001\u4fe1\u3084Microsoft Teams\u30ce\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u3001\u8907\u6570\u306e\u30c1\u30e3\u30cd\u30eb\u306b\u901a\u77e5\u3067\u304d\u307e\u3059\u3002\n\n- **API\u5229\u7528\u91cf\u306e\u6ce8\u610f:**\n\u3053\u306e\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306f\u30d5\u30a1\u30a4\u30eb\u8ffd\u52a0\u3054\u3068\u306bDeepL API\u30922\u56de\uff08\u7ffb\u8a33\uff0b\u9006\u7ffb\u8a33\uff09\u547c\u3073\u51fa\u3057\u307e\u3059\u3002\u5927\u91cf\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406\u3059\u308b\u5834\u5408\u3001DeepL\u306e\u5229\u7528\u6599\u91d1\u3084\u30d7\u30e9\u30f3\u4e0a\u9650\u306b\u3054\u6ce8\u610f\u304f\u3060\u3055\u3044\u3002\n\n- **\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u306e\u5236\u9650:**\n\u30c6\u30ad\u30b9\u30c8\u62bd\u51fa\u306fGoogle\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u307e\u305f\u306f\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u53ef\u80fd\u306a\u30d5\u30a1\u30a4\u30eb\uff08\u4f8b: .docx\uff09\u3067\u6700\u9069\u306b\u52d5\u4f5c\u3057\u307e\u3059\u3002\u30b9\u30ad\u30e3\u30f3\u3055\u308c\u305fPDF\u3084\u753b\u50cf\u5185\u306e\u30c6\u30ad\u30b9\u30c8\u306f\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3002"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "c69777ba-f626-4b80-a9c1-a54000b08597",
  "connections": {
    "Translate JP to EN": {
      "main": [
        [
          {
            "node": "Back-Translate EN to JP",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Diff Analysis": {
      "main": [
        [
          {
            "node": "Create Diff Report in Google Docs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Workflow Configuration": {
      "main": [
        [
          {
            "node": "Get Text via Authenticated API Call",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Back-Translate EN to JP": {
      "main": [
        [
          {
            "node": "Generate Diff Analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Watch for New Japanese Documents": {
      "main": [
        [
          {
            "node": "Workflow Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Diff Report in Google Docs": {
      "main": [
        [
          {
            "node": "Send Slack Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Text via Authenticated API Call": {
      "main": [
        [
          {
            "node": "Translate JP to EN",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Japanese Document Translation Quality Checker with DeepL & Google Drive to Slack

Source: https://n8n.io/workflows/10315/ — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

This template monitors Google Drive folder for new files, extracts text from PDFs, images, text files, CSVs, and Google Docs., reads images with meta/llama-3.2-11b-vision-instruct, structures the resu

Google Drive Trigger, Google Drive, Google Docs +3
Slack & Telegram

Webhook Slack. Uses theHiveProjectTrigger, stickyNote, httpRequest, theHiveProject. Event-driven trigger; 63 nodes.

The Hive Project Trigger, HTTP Request, The Hive Project +1
Slack & Telegram

Key Features: Direct Case Management: Modify case details such as assignee, severity, status, and more through intuitive form inputs embedded within Slack messages. Seamless Integration: Assumes match

The Hive Project Trigger, HTTP Request, The Hive Project +1
Slack & Telegram

Transform your lead list into an AI-powered calling machine. This workflow automates your entire cold calling process using Vapi's conversational AI to initiate calls, qualify leads, capture detailed

Google Sheets, HTTP Request, Slack
Slack & Telegram

Type in Slack. Walk away. Get a professional PDF report and a structured Excel fix sheet delivered to Google Drive and posted back in your Slack thread — fully automated, zero manual work.

Compression, HTTP Request, Google Drive +3