У меня есть лист с данными, которые импортируются через IMPORTRANGE на другой лист. Когда я вношу изменения в Таблицу 1 >>> Таблицу 2, у меня есть скрипт, который копирует данные из Копировать в Вставку. Он работает нормально, однако я хочу убедиться, что скрипт запускается только при внесении изменений на листе «Копировать», а не в любом другом. На данный момент он работает независимо от того, на каком листе я делаю изменения.
Я пробовал триггер onChange двумя разными способами... Этот вносит изменения, но срабатывает, когда изменения вносятся в любой из листов.
function Trigger2(e) {
var sheet = e.source.getActiveSheet();
if (sheet.getName() === 'Copy') {
copyInfo();
}
}
И (это не работает)
function Trigger2(e) {
var sheet = e.source.getActiveSheet();
var sheet = SpreadsheetApp.getActiveSpreadsheet();
if ( sheet.getActiveSheet().getName() !== "Copy" ) return;{
copyInfo();
}}
Код копирования выглядит так...
function copyInfo() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var copySheet = ss.getSheetByName("Copy");
var pasteSheet = ss.getSheetByName("Paste");
// get source range
var source = copySheet.getRange(2,1,12,8);
// get destination range
var destination = pasteSheet.getRange(2,1,12,8);
// copy values to destination range
source.copyTo(destination);
}
Простой if
должен работать, но вы пытаетесь сравнить имя не с тем полем. Согласно документация Google, поле source
в объекте события e
возвращает объект Электронная таблица, который представляет собой весь документ.
Вместо этого вы можете использовать поле e.range
, которое содержит точный диапазон, в котором было сделано редактирование, а класс Range
имеет метод getSheet()
для получения родительского листа.
Таким образом, вы можете изменить свой образец следующим образом:
function Trigger2(e) {
var sheet = e.range.getSheet();
if (sheet.getName() === 'Copy') {//Edit: this will only work if sheet is the most left sheet in the spreadsheet
copyInfo();
}
}
Большое спасибо за это, но это все еще не работает по какой-то причине. Он просто говорит, что по каким-то причинам его выполнение не удалось.
Я проверил это с помощью простого предупреждения, и это сработало. Возможно, функция копирования не работает. Какую ошибку вы получаете? Вы можете щелкнуть вкладку «Выполнения» слева и щелкнуть неудачные выполнения, чтобы увидеть сообщение об ошибке.
Пишет "Ошибка типа: невозможно прочитать диапазон свойств неопределенного"
Вы пытаетесь протестировать его, нажав кнопку «Выполнить»? Поскольку это триггер, переменная e
будет иметь данные только тогда, когда вы фактически редактируете лист. Вы можете попробовать переименовать функцию в onEdit(e)
, чтобы настроить ее как простой триггер, а затем попробовать ее на листе, отредактировав ячейку.
Думаю, я слишком усложняю себе жизнь. Вместо того, чтобы копировать свой контент на вторую вкладку, я скопирую его в отдельный файл с расширением, и мне не нужно беспокоиться о том, что кто-то возится с другими вкладками и запускает код по ошибке. В любом случае большое спасибо за ваше время.
Нет e.range с объектом события onChange, а e.source.getActiveSheet() всегда возвращает SpreadsheetApp.getActive().getSheets()[0], поэтому он относительно бесполезен. Хорошая новость заключается в том, что изменение данных в исходной электронной таблице вызывает срабатывание триггера onChange.
Вот как выглядит объект события onChange {"authMode":"FULL","changeType":"OTHER","source":{},"triggerUid":""}
Электронная таблица 2 Импортирует диапазон на Лист 1 из Таблицы 1 Лист 1, и когда в Таблице 2 Лист 1 происходит изменение, мы копируем данные из Таблицы 2 Лист 1 в Таблицу 2 Лист 2.
function onMyChange(e) {
//Logger.log(JSON.stringify(e));//useful during setup
//e.source.toast("Entry");//useful during setup
const sh = e.source.getSheetByName("Sheet1")
Logger.log(sh.getName());
if (e.changeType == "OTHER") {
let tsh = e.source.getSheetByName("Sheet2");
sh.getRange(2,1,12,8).copyTo(tsh.getRange(2,1));//Only need the upper left hand corner of the range. Thus you change change the size of the source data without having to change the target range.
}
}
Можно было бы попытаться использовать e.source.getActiveSheet(), к сожалению, это не обязательно для получения листа, который вы написали, если только это не SpreadsheetApp.getActive().getSheets()[0]. В этой ситуации объект события onChange всегда возвращает самый левый лист в электронной таблице, поэтому его нельзя использовать для идентификации листа, на который выполняется запись из функции importRange.
С этой функцией вам больше не нужна другая функция.
Большое спасибо! Это сработало. Это было выше моих сил, поэтому ваша помощь очень ценится, спасибо!
Вы можете взглянуть на мой ответ. Я много работал с событием onChange, и оно будет работать в той ситуации, как вы хотите, но на самом деле его нельзя использовать для идентификации измененного листа. Поэтому попытка сделать то же самое с другой парой листов будет затруднена, потому что вы не будете знать, какой лист вызвал событие.