Копирование / перенос из одной электронной таблицы в другую на основе кода - PullRequest
1 голос
/ 06 июня 2019

Я пытаюсь скопировать / перенести лист из одной электронной таблицы в другую.Я пробовал различные методы, и .copyTo, кажется, является лучшим и наиболее эффективным способом.

.copyTo работает хорошо, но я пытаюсь отправить на определенный лист ...

Вотмой код:

 function TransferDataOut() {

 var source = SpreadsheetApp.getActiveSpreadsheet();
 var sheetA = source.getSheets()[0]; //sheet source number  

 var destination = SpreadsheetApp.openById('the destination sheet');
 var each = "Data_Incoming"; 

 var ss = SpreadsheetApp.getActiveSpreadsheet();

 sheetA.copyTo(destination); // I tried renaming .setName(each);


 }

Так что, если я использую только sheetA.copyTo (destination);он просто создает копию листа, например, копию the_souce_sheet_name.Если я попытаюсь переименовать его, чтобы сделать его конкретным именем, я получу ошибку после запуска во второй раз, когда лист уже существует в целевой таблице.

Что мне действительно нужно, так это то, что функция из исходной электронной таблицы копирует данныеот исходного листа до всегда одного и того же листа в целевой таблице.Возможно .copyTo не правильный способ сделать это?Любые предложения и код помогут, пожалуйста!

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

1 Ответ

1 голос
/ 06 июня 2019
  • Вы хотите перезаписать исходный лист электронной таблицы A на целевой лист электронной таблицы B.
  • Вы хотите сохранить имя листа var each = "Data_Incoming".

Если мое понимание верно, как насчет этого ответа? Я хотел бы предложить 2 образца. Поэтому, пожалуйста, выберите один из них для вашей ситуации.

Пример сценария 1:

Порядок выполнения этого примера сценария следующий.

  1. each лист электронной таблицы B. удален.
  2. Исходный лист электронной таблицы A копируется на целевой лист электронной таблицы B.
  3. Имя листа скопированной таблицы электронной таблицы B изменено на each.

Модифицированный скрипт:

function TransferDataOut() {
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var sheetA = source.getSheets()[0]; //sheet source number
  var destination = SpreadsheetApp.openById('the destination sheet');
  var each = "Data_Incoming"; 
  var destSheet = destination.getSheetByName(each);
  if (destSheet) {
    destination.deleteSheet(destSheet);
  }
  sheetA.copyTo(destination).setName(each);
}

Пример сценария 2:

Порядок выполнения этого примера сценария следующий.

  1. Скопируйте исходный лист электронной таблицы A в электронную таблицу B.
  2. Если лист с именем листа each не существует в электронной таблице B, скопированный лист переименовывается в each.

  3. Если лист с именем листа each существует в электронной таблице B, исходный лист копируется в электронную таблицу B как Copy of ###.

  4. each лист очищается.
  5. Все значения, формулы и форматы скопированного листа копируются в each лист.
  6. Удалить скопированный лист.

Модифицированный скрипт:

function TransferDataOut() {
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var sheetA = source.getSheets()[0]; //sheet source number  
  var destination = SpreadsheetApp.openById('the destination sheet');
  var each = "Data_Incoming";
  var copiedSheet = sheetA.copyTo(destination);
  var destSheet = destination.getSheetByName(each);
  if (destSheet) {
    destSheet.clear();
    var srcRange = copiedSheet.getDataRange();
    srcRange.copyTo(destSheet.getRange(srcRange.getA1Notation()));
    destination.deleteSheet(copiedSheet);
  } else {
    copiedSheet.setName(each);
  }
}

Примечание:

  • В этом примере сценария each лист электронной таблицы B (электронная таблица назначения) удаляется. Поэтому, пожалуйста, будьте осторожны с этим.
    • Итак, сначала, в качестве теста, я рекомендую использовать образец таблицы.

Ссылки

Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения.

Добавлено:

  • Вы хотите запустить сценарий целевой электронной таблицы, когда исходные значения копируются в конечную электронную таблицу, используя сценарий в исходной электронной таблице.

Следующий пример сценария предназначен для достижения вышеуказанной ситуации.

Сценарий назначения Таблица:

Сначала готовится сценарий электронной таблицы назначения.

Автор сценария:
function doGet() {

  sample(); // This is the function that you want to run when the source values are copied.

  return ContentService.createTextOutput();
}

После копирования и вставки вышеуказанного сценария в редактор сценариев электронной таблицы назначения выполните следующий поток действий.

  • Развертывание веб-приложений.
    1. В редакторе сценариев откройте диалоговое окно с помощью «Опубликовать» -> «Развернуть как веб-приложение».
    2. Выберите «Я» для «Выполнить приложение как:».
    3. Выберите «Любой, даже анонимный» для «У кого есть доступ к приложению:».
    4. Нажмите кнопку «Развернуть» как новую «Версия проекта».
    5. Автоматически открывать диалоговое окно «Требуется авторизация».
      1. Нажмите «Разрешения на просмотр».
      2. Выберите собственную учетную запись.
      3. Нажмите «Дополнительно» на «Это приложение не подтверждено».
      4. Нажмите «Перейти к ### имени проекта ### (небезопасно)»
      5. Нажмите кнопку «Разрешить».
    6. Копировать «Текущий URL веб-приложения:».
    7. Нажмите «ОК».

Скрипт исходной таблицы:

В качестве следующего шага сценарий исходной таблицы готовится следующим образом. В этом образце использовался образец 2. Я думаю, что вы также можете использовать образец 1.

Автор сценария:
function TransferDataOut() {
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var sheetA = source.getSheets()[0]; //sheet source number  
  var destination = SpreadsheetApp.openById('the destination sheet');
  var each = "Data_Incoming";
  var copiedSheet = sheetA.copyTo(destination);
  var destSheet = destination.getSheetByName(each);
  if (destSheet) {
    destSheet.clear();
    var srcRange = copiedSheet.getDataRange();
    srcRange.copyTo(destSheet.getRange(srcRange.getA1Notation()));
    destination.deleteSheet(copiedSheet);
  } else {
    copiedSheet.setName(each);
  }

  // Added
  var url = "https://script.google.com/macros/s/###/exec"; // Please set the retrieved URL of Web Apps.
  UrlFetchApp.fetch(url);
}

Примечание:

  • При указанных выше настройках при запуске TransferDataOut() исходной электронной таблицы doGet() целевой электронной таблицы запускается UrlFetchApp.fetch(url).

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...