Перевести текст из Документов, Таблиц и Презентаций Google

Уровень кодирования : Средний
Продолжительность : 30 минут
Тип проекта : дополнение к Google Workspace.

Цели

  • Поймите, что делает решение.
  • Узнайте, что делают службы Apps Script в решении.
  • Настройте среду.
  • Настройте сценарий.
  • Запустите сценарий.

Об этом решении

С помощью этого решения вы можете легко переводить текст из Документов, Таблиц и Презентаций Google.

Снимок экрана дополнения Translate Google Workspace

Как это работает

Когда вы выделяете текст в документах, таблицах или слайдах и нажимаете «Получить выделение» в надстройке, скрипт копирует текст в надстройку, переводит его и отображает переведенный текст.

По умолчанию скрипт определяет исходный язык и переводит текст на английский. Вы можете редактировать исходный и целевой языки.

Службы сценариев приложений

В этом решении используются следующие сервисы:

Предварительные условия

Для использования этого образца необходимы следующие предварительные условия:

  • Учетная запись Google (для учетных записей Google Workspace может потребоваться одобрение администратора).
  • Веб-браузер с доступом в Интернет.

  • Проект Google Cloud .

Настройте свою среду

Откройте свой облачный проект в консоли Google Cloud.

Если он еще не открыт, откройте проект Cloud, который вы собираетесь использовать для этого примера:

  1. В консоли Google Cloud перейдите на страницу «Выбор проекта» .

    Выберите облачный проект

  2. Выберите проект Google Cloud, который вы хотите использовать. Или нажмите «Создать проект» и следуйте инструкциям на экране. Если вы создаете проект Google Cloud, вам может потребоваться включить для него оплату .

Для надстроек Google Workspace требуется настройка экрана согласия. Настройка экрана согласия OAuth вашего дополнения определяет, что Google отображает пользователям.

  1. В консоли Google Cloud перейдите в Меню > > Брендинг .

    Перейти к Брендингу

  2. Если вы уже настроили вы можете настроить следующие параметры экрана согласия OAuth в разделах «Брендинг» , «Аудитория» и «Доступ к данным» . Если вы видите сообщение, в котором говорится еще не настроено , нажмите «Начать» :
    1. В разделе «Информация о приложении» в поле «Имя приложения» введите имя приложения.
    2. В разделе «Электронная почта поддержки пользователей» выберите адрес электронной почты службы поддержки, по которому пользователи смогут связаться с вами, если у них возникнут вопросы относительно их согласия.
    3. Нажмите Далее .
    4. В разделе «Аудитория» выберите «Внутренняя» .
    5. Нажмите Далее .
    6. В разделе «Контактная информация » введите адрес электронной почты , по которому вы сможете получать уведомления о любых изменениях в вашем проекте.
    7. Нажмите Далее .
    8. В разделе «Готово » ознакомьтесь с Политикой пользовательских данных служб Google API и, если вы согласны, выберите Я согласен с Политикой пользовательских данных служб Google API: Политика пользовательских данных .
    9. Нажмите Продолжить .
    10. Нажмите Создать .
  3. На данный момент вы можете пропустить добавление областей. В будущем, когда вы создадите приложение для использования за пределами вашей организации Google Workspace, вам необходимо изменить тип пользователя на Внешний . Затем добавьте области авторизации, необходимые вашему приложению. Дополнительные сведения см. в полном руководстве по настройке согласия OAuth .

Настройте сценарий

Создайте проект скрипта приложений.

  1. Нажмите следующую кнопку, чтобы открыть проект Translate Apps Script.
    Открыть проект

  2. Нажмите Обзор .

  3. На странице обзора нажмите «Создать копию». Значок для создания копии .

Скопируйте номер облачного проекта

  1. В консоли Google Cloud выберите > IAM и администрирование > Настройки .

    Перейдите в IAM и настройки администратора.

  2. В поле Номер проекта скопируйте значение.

Установите облачный проект проекта Apps Script.

  1. В скопированном проекте Apps Script нажмите «Настройки проекта». Значок настроек проекта .
  2. В разделе «Проект Google Cloud Platform (GCP)» нажмите «Изменить проект» .
  3. В поле «Номер проекта GCP» вставьте номер проекта Google Cloud.
  4. Нажмите Установить проект .

Установите тестовое развертывание

  1. В скопированном проекте Apps Script нажмите « редактора» .
  2. Откройте файл Code.gs и нажмите «Выполнить» . При появлении запроса авторизуйте сценарий.
  3. Щелкните Развертывание > Тестовые развертывания .
  4. Нажмите «Установить» > «Готово» .

Запустите сценарий

  1. Откройте файл в Документах Google , Таблицах или Презентациях или создайте новый.
  2. На правой боковой панели откройте дополнение .
  3. При появлении запроса авторизуйте надстройку.
  4. Выделите текст в файле.
  5. В дополнении нажмите «Получить выделение» > «Перевести» .

Просмотрите код

Чтобы просмотреть код скрипта приложений для этого решения, нажмите «Просмотреть исходный код» ниже:

Посмотреть исходный код

Код.gs

const DEFAULT_INPUT_TEXT = ''; const DEFAULT_OUTPUT_TEXT = ''; const DEFAULT_ORIGIN_LAN = ''; // Empty string means detect langauge const DEFAULT_DESTINATION_LAN = 'en' // English  const LANGUAGE_MAP =   [     { text: 'Detect Language', val: '' },     { text: 'Afrikaans', val: 'af' },     { text: 'Albanian', val: 'sq' },     { text: 'Amharic', val: 'am' },     { text: 'Arabic', val: 'ar' },     { text: 'Armenian', val: 'hy' },     { text: 'Azerbaijani', val: 'az' },     { text: 'Basque', val: 'eu' },     { text: 'Belarusian', val: 'be' },     { text: 'Bengali', val: 'bn' },     { text: 'Bosnian', val: 'bs' },     { text: 'Bulgarian', val: 'bg' },     { text: 'Catalan', val: 'ca' },     { text: 'Cebuano', val: 'ceb' },     { text: 'Chinese (Simplified)', val: 'zh-CN' },     { text: 'Chinese (Traditional)', val: 'zh-TW' },     { text: 'Corsican', val: 'co' },     { text: 'Croatian', val: 'hr' },     { text: 'Czech', val: 'cs' },     { text: 'Danish', val: 'da' },     { text: 'Dutch', val: 'nl' },     { text: 'English', val: 'en' },     { text: 'Esperanto', val: 'eo' },     { text: 'Estonian', val: 'et' },     { text: 'Finnish', val: 'fi' },     { text: 'French', val: 'fr' },     { text: 'Frisian', val: 'fy' },     { text: 'Galician', val: 'gl' },     { text: 'Georgian', val: 'ka' },     { text: 'German', val: 'de' },     { text: 'Greek', val: 'el' },     { text: 'Gujarati', val: 'gu' },     { text: 'Haitian Creole', val: 'ht' },     { text: 'Hausa', val: 'ha' },     { text: 'Hawaiian', val: 'haw' },     { text: 'Hebrew', val: 'he' },     { text: 'Hindi', val: 'hi' },     { text: 'Hmong', val: 'hmn' },     { text: 'Hungarian', val: 'hu' },     { text: 'Icelandic', val: 'is' },     { text: 'Igbo', val: 'ig' },     { text: 'Indonesian', val: 'id' },     { text: 'Irish', val: 'ga' },     { text: 'Italian', val: 'it' },     { text: 'Japanese', val: 'ja' },     { text: 'Javanese', val: 'jv' },     { text: 'Kannada', val: 'kn' },     { text: 'Kazakh', val: 'kk' },     { text: 'Khmer', val: 'km' },     { text: 'Korean', val: 'ko' },     { text: 'Kurdish', val: 'ku' },     { text: 'Kyrgyz', val: 'ky' },     { text: 'Lao', val: 'lo' },     { text: 'Latin', val: 'la' },     { text: 'Latvian', val: 'lv' },     { text: 'Lithuanian', val: 'lt' },     { text: 'Luxembourgish', val: 'lb' },     { text: 'Macedonian', val: 'mk' },     { text: 'Malagasy', val: 'mg' },     { text: 'Malay', val: 'ms' },     { text: 'Malayalam', val: 'ml' },     { text: 'Maltese', val: 'mt' },     { text: 'Maori', val: 'mi' },     { text: 'Marathi', val: 'mr' },     { text: 'Mongolian', val: 'mn' },     { text: 'Myanmar (Burmese)', val: 'my' },     { text: 'Nepali', val: 'ne' },     { text: 'Norwegian', val: 'no' },     { text: 'Nyanja (Chichewa)', val: 'ny' },     { text: 'Pashto', val: 'ps' },     { text: 'Persian', val: 'fa' },     { text: 'Polish', val: 'pl' },     { text: 'Portuguese (Portugal, Brazil)', val: 'pt' },     { text: 'Punjabi', val: 'pa' },     { text: 'Romanian', val: 'ro' },     { text: 'Russian', val: 'ru' },     { text: 'Samoan', val: 'sm' },     { text: 'Scots Gaelic', val: 'gd' },     { text: 'Serbian', val: 'sr' },     { text: 'Sesotho', val: 'st' },     { text: 'Shona', val: 'sn' },     { text: 'Sindhi', val: 'sd' },     { text: 'Sinhala (Sinhalese)', val: 'si' },     { text: 'Slovak', val: 'sk' },     { text: 'Slovenian', val: 'sl' },     { text: 'Somali', val: 'so' },     { text: 'Spanish', val: 'es' },     { text: 'Sundanese', val: 'su' },     { text: 'Swahili', val: 'sw' },     { text: 'Swedish', val: 'sv' },     { text: 'Tagalog (Filipino)', val: 'tl' },     { text: 'Tajik', val: 'tg' },     { text: 'Tamil', val: 'ta' },     { text: 'Telugu', val: 'te' },     { text: 'Thai', val: 'th' },     { text: 'Turkish', val: 'tr' },     { text: 'Ukrainian', val: 'uk' },     { text: 'Urdu', val: 'ur' },     { text: 'Uzbek', val: 'uz' },     { text: 'Vietnamese', val: 'vi' },     { text: 'Welsh', val: 'cy' },     { text: 'Xhosa', val: 'xh' },     { text: 'Yiddish', val: 'yi' },     { text: 'Yoruba', val: 'yo' },     { text: 'Zulu', val: 'zu' }   ];   /**  * Callback for rendering the main card.  * @return {CardService.Card} The card to show the user.  */ function onHomepage(e) {   return createSelectionCard(e, DEFAULT_ORIGIN_LAN, DEFAULT_DESTINATION_LAN, DEFAULT_INPUT_TEXT, DEFAULT_OUTPUT_TEXT); }  /**  * Main function to generate the main card.  * @param {String} originLanguage Language of the original text.  * @param {String} destinationLanguage Language of the translation.  * @param {String} inputText The text to be translated.  * @param {String} outputText The text translated.  * @return {CardService.Card} The card to show to the user.  */ function createSelectionCard(e, originLanguage, destinationLanguage, inputText, outputText) {   var hostApp = e['hostApp'];   var builder = CardService.newCardBuilder();    // "From" language selection & text input section   var fromSection = CardService.newCardSection()     .addWidget(generateLanguagesDropdown('origin', 'From: ', originLanguage))     .addWidget(CardService.newTextInput()       .setFieldName('input')       .setValue(inputText)       .setTitle('Enter text...')       .setMultiline(true));    if (hostApp === 'docs') {     fromSection.addWidget(CardService.newButtonSet()       .addButton(CardService.newTextButton()         .setText('Get Selection')         .setOnClickAction(CardService.newAction().setFunctionName('getDocsSelection'))         .setDisabled(false)))   } else if (hostApp === 'sheets') {     fromSection.addWidget(CardService.newButtonSet()       .addButton(CardService.newTextButton()         .setText('Get Selection')         .setOnClickAction(CardService.newAction().setFunctionName('getSheetsSelection'))         .setDisabled(false)))   } else if (hostApp === 'slides') {     fromSection.addWidget(CardService.newButtonSet()       .addButton(CardService.newTextButton()         .setText('Get Selection')         .setOnClickAction(CardService.newAction().setFunctionName('getSlidesSelection'))         .setDisabled(false)))   }     builder.addSection(fromSection);    // "Translation" language selection & text input section   builder.addSection(CardService.newCardSection()     .addWidget(generateLanguagesDropdown('destination', 'To: ', destinationLanguage))     .addWidget(CardService.newTextInput()       .setFieldName('output')       .setValue(outputText)       .setTitle('Translation...')       .setMultiline(true)));    //Buttons section   builder.addSection(CardService.newCardSection()     .addWidget(CardService.newButtonSet()       .addButton(CardService.newTextButton()         .setText('Translate')         .setTextButtonStyle(CardService.TextButtonStyle.FILLED)         .setOnClickAction(CardService.newAction().setFunctionName('translateText'))         .setDisabled(false))       .addButton(CardService.newTextButton()         .setText('Clear')         .setOnClickAction(CardService.newAction().setFunctionName('clearText'))         .setDisabled(false))));    return builder.build();  }  /**  * Helper function to generate the drop down language menu. It checks what language the user had selected.  * @param {String} fieldName  * @param {String} fieldTitle  * @param {String} previousSelected The language the user previously had selected.  * @return {CardService.SelectionInput} The card to show to the user.  */ function generateLanguagesDropdown(fieldName, fieldTitle, previousSelected) {   var selectionInput = CardService.newSelectionInput().setTitle(fieldTitle)     .setFieldName(fieldName)     .setType(CardService.SelectionInputType.DROPDOWN);    LANGUAGE_MAP.forEach((language, index, array) => {     selectionInput.addItem(language.text, language.val, language.val == previousSelected);   })    return selectionInput; }  /**  * Helper function to translate the text. If the originLanguage is an empty string, the API detects the language  * @return {CardService.Card} The card to show to the user.  */ function translateText(e) {   var originLanguage = e.formInput.origin;   var destinationLanguage = e.formInput.destination;   var inputText = e.formInput.input;    if (originLanguage !== destinationLanguage && inputText !== undefined) {     var translation = LanguageApp.translate(e.formInput.input, e.formInput.origin, e.formInput.destination);     return createSelectionCard(e, originLanguage, destinationLanguage, inputText, translation);   } }  /**  * Helper function to clean the text.  * @return {CardService.Card} The card to show to the user.  */ function clearText(e) {   var originLanguage = e.formInput.origin;   var destinationLanguage = e.formInput.destination;   return createSelectionCard(e, originLanguage, destinationLanguage, DEFAULT_INPUT_TEXT, DEFAULT_OUTPUT_TEXT); }  /**  * Helper function to get the text selected.  * @return {CardService.Card} The selected text.  */ function getDocsSelection(e) {   var text = '';   var selection = DocumentApp.getActiveDocument().getSelection();   Logger.log(selection)   if (selection) {     var elements = selection.getRangeElements();     for (var i = 0; i < elements.length; i++) {       Logger.log(elements[i]);       var element = elements[i];       // Only modify elements that can be edited as text; skip images and other non-text elements.       if (element.getElement().asText() && element.getElement().asText().getText() !== '') {         text += element.getElement().asText().getText() + '\n';       }     }   }    if (text !== '') {     var originLanguage = e.formInput.origin;     var destinationLanguage = e.formInput.destination;     var translation = LanguageApp.translate(text, e.formInput.origin, e.formInput.destination);     return createSelectionCard(e, originLanguage, destinationLanguage, text, translation);   } }  /**  * Helper function to get the text of the selected cells.  * @return {CardService.Card} The selected text.  */ function getSheetsSelection(e) {   var text = '';   var ranges = SpreadsheetApp.getActive().getSelection().getActiveRangeList().getRanges();   for (var i = 0; i < ranges.length; i++) {     const range = ranges[i];     const numRows = range.getNumRows();     const numCols = range.getNumColumns();     for (let i = 1; i <= numCols; i++) {       for (let j = 1; j <= numRows; j++) {         const cell = range.getCell(j, i);         if (cell.getValue()) {           text += cell.getValue() + '\n';         }       }     }   }   if (text !== '') {     var originLanguage = e.formInput.origin;     var destinationLanguage = e.formInput.destination;     var translation = LanguageApp.translate(text, e.formInput.origin, e.formInput.destination);     return createSelectionCard(e, originLanguage, destinationLanguage, text, translation);   } }  /**  * Helper function to get the selected text of the active slide.  * @return {CardService.Card} The selected text.  */ function getSlidesSelection(e) {   var text = '';   var selection = SlidesApp.getActivePresentation().getSelection();   var selectionType = selection.getSelectionType();   if (selectionType === SlidesApp.SelectionType.TEXT) {     var textRange = selection.getTextRange();     if (textRange.asString() !== '') {       text += textRange.asString() + '\n';     }   }   if (text !== '') {     var originLanguage = e.formInput.origin;     var destinationLanguage = e.formInput.destination;     var translation = LanguageApp.translate(text, e.formInput.origin, e.formInput.destination);     return createSelectionCard(e, originLanguage, destinationLanguage, text, translation);   } }

appsscript.json

{   "timeZone": "America/New_York",   "dependencies": {},   "exceptionLogging": "STACKDRIVER",   "oauthScopes": [     "https://www.googleapis.com/auth/documents.currentonly",     "https://www.googleapis.com/auth/spreadsheets.currentonly",     "https://www.googleapis.com/auth/presentations.currentonly"   ],   "runtimeVersion": "V8",   "addOns": {     "common": {       "name": "Translate",       "logoUrl": "https://www.gstatic.com/images/branding/product/1x/translate_24dp.png",       "layoutProperties": {         "primaryColor": "#2772ed"       },       "homepageTrigger": {         "runFunction": "onHomepage"       }     },     "docs" : {},     "slides" : {},     "sheets" : {}   } }

Авторы

Этот образец поддерживается Google с помощью экспертов-разработчиков Google.

Следующие шаги