Использование одного сценария для копирования текста из ячеек в строке на другой лист с помощью значка в строке - PullRequest
1 голос
/ 03 марта 2020

Из моего предыдущего поста ( Скопируйте значение ячейки с одной ячейки на другую, щелкнув значок в листах Google ). Теперь я столкнулся с новой проблемой, с которой мне хотелось бы, чтобы кто-нибудь помог мне.

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

Все идет нормально. Он работает и работает с помощью этого замечательного сообщества. Я использую этот сценарий:

function copyPasteValue2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Ark1');
  var r = s.getRange('b2');
  var v = r.getValue();
  var a = s.getRange('c2');
  var d = a.getValue();
  var s2 = ss.getSheetByName('Ark2');
  var timeZone = ss.getSpreadsheetTimeZone();
  var t = Utilities.formatDate(new Date(), timeZone, 'HH:mm:ss dd-MM-yyyy');
  s2.getRange('A2:C2').setValues([[t,v,d]]);
}

Теперь я смотрю, как увеличить этот лист и содержать более 100 записей с этой способностью - щелкните значок в столбце A и переместите данные в C и B к листу 2.

Мой вопрос: как я могу достичь этого, не создавая еще 100 сценариев? Пока я медленно продвигаюсь здесь, мой поиск еще не дал решения.

Я сделал тестовый лист для любой помощи здесь: https://docs.google.com/spreadsheets/d/1z5TGWp3N002z0GNts4NRyspkjXcsN52rxPtx8Pu9D70/edit#gid =

1 Ответ

3 голосов
/ 04 марта 2020
  • Вы хотите запустить скрипт, щелкнув изображение в электронной таблице.
  • Вы хотите поместить изображения в столбец «A». В этом случае вы хотите поместить много изображений.
  • Вы хотите добиться этого с помощью простого сценария.

Проблема и обходной путь:

  • К сожалению, на текущем этапе, когда скрипт запускается нажатием на изображение на листе, скрипт не может знать, где щелкнуло изображение. Таким образом, к сожалению, в вашем случае, когда вы хотите запустить скрипт, щелкнув изображение, необходимо назначить каждому изображению другое имя функции.
  • А также, когда скрипт запускается нажатием изображение, кажется, что функция ищется до запуска глобальных переменных. Таким образом, автоматическая установка функций с использованием скрипта не может быть достигнута.

Из вышеприведенной ситуации, чтобы достичь вашей цели, я хотел бы предложить следующие 2 шаблона.

Шаблон 1:

В этом шаблоне используются изображения, которым назначены функции. В этом случае в качестве примера предполагается, что на лист Ark1 помещается 5 изображений, и каждое изображение имеет имена функций, такие как copyPasteValue2, copyPasteValue3 и т. Д.

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

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

function main(row) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Ark1');
  var [v, d] = s.getRange(`B${row}:C${row}`).getValues()[0];
  var s2 = ss.getSheetByName('Ark2');
  var timeZone = ss.getSpreadsheetTimeZone();
  var t = Utilities.formatDate(new Date(), timeZone, 'HH:mm:ss dd-MM-yyyy');
  s2.getRange(`A${row}:C${row}`).setValues([[t,v,d]]);
}

const copyPasteValue2 = () => main(2);
const copyPasteValue3 = () => main(3);
const copyPasteValue4 = () => main(4);
const copyPasteValue5 = () => main(5);
const copyPasteValue6 = () => main(6);
  • В этом скрипте при нажатии на изображение с именем функции copyPasteValue2, 2 - строка изображения отдается функции main(). Таким образом, copyPasteValue2 можно запустить как строку 2.

Примечание:

  • О const copyPasteValue2 = () => main(2); const copyPasteValue3 = () => main(3); ,,,, формат постоянен. Так, например, я думаю, что вы также можете создать эти сценарии в виде текстового файла, а затем скопировать и вставить их в редактор сценариев.
  • Если вы хотите вставить изображения в столбец " А «используя скрипт, вы можете использовать следующую функцию. При использовании этого, пожалуйста, установите идентификатор файла изображения на Google Drive. И, пожалуйста, установите sheetName и max.

    function insertImages() {
      var id = "###";  // Please set the file ID of the image.
      var sheetName = "Sheet1"; // Please set the sheet name.
      var max = 5;  // Please set the number of images you want to put.
    
      var blob = DriveApp.getFileById(id).getBlob();
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName(sheetName);
      sheet.setRowHeights(2, max, 64).setColumnWidth(1, 64);
      for (var i = 0; i < max; i++) {
        sheet.insertImage(blob, 1, i + 2).setHeight(64).setWidth(64).assignScript("copyPasteValue" + (i + 2));
      }
    }
    

Шаблон 2:

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

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

function main(row) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Ark1');
  var [v, d] = s.getRange(`B${row}:C${row}`).getValues()[0];
  var s2 = ss.getSheetByName('Ark2');
  var timeZone = ss.getSpreadsheetTimeZone();
  var t = Utilities.formatDate(new Date(), timeZone, 'HH:mm:ss dd-MM-yyyy');
  s2.getRange(`A${row}:C${row}`).setValues([[t,v,d]]);
}

function onEdit(e) {
  const range = e.range;
  if (range.getSheet().getSheetName() == "Ark1" && e.value == "TRUE") {
    main(range.rowStart);
    range.uncheck();
  }
}
  • В приведенном выше сценарии предполагается, что столбец «А» на листе из Ark1 имеет флажки.
  • В этом случае вы можете запустить скрипт, используя простой триггер.

Примечание:

  • В этом В этом случае включите V8 в редакторе сценариев.

Ссылки:

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

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