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 →
{
"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
}
]
]
}
}
}
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
Webhook Slack. Uses theHiveProjectTrigger, stickyNote, httpRequest, theHiveProject. Event-driven trigger; 63 nodes.
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
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
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.