#google-apps-script #google-sheets
Вопрос:
По сути, я хочу скопировать ячейку, но взять наибольшее число, которое было в этой ячейке.
Бывший
У меня есть ячейка B1 с начальным значением 10, копирующая ячейку B1 в другую ячейку, например, B2, значение всегда будет равно 10, но если ячейка B1 становится 5, я хочу, чтобы ячейка B2 оставалась 10. Но, в свою очередь, если ячейка B1 становится 20, то и ячейка B2 становится 20 и так далее ……. если ячейка B1 все еще уменьшается до 8, например, ячейка B2 теперь всегда остается 20, продолжая таким образом.
По сути, я хочу, чтобы B2 принимал значение B1, но не равнялся только самому большому значению, которое когда-либо имел B1.
Комментарии:
1. Для этого потребуется vba в Excel или script в Google таблицах. Это невозможно надежно выполнить с помощью формулы, поскольку для этого потребуется циклическая ссылка. Итак, вам нужно будет показать, что вы пробовали, и выбрать, каким путем вы хотите пойти.
2. Я использую Google таблицы
3. Поэтому я пытаюсь сделать только это, например, поместить это «= MAX (B1)» в B2, но это не работает
4. Я понятия не имею, как я могу это сделать, если есть циркуляр, как это было бы сделано?
5. Вам нужно использовать скрипт приложений.
Ответ №1:
В вашей ситуации, как насчет следующего примера сценария, созданного с помощью Google Apps Script? В этом примере сценария скрипт можно использовать в качестве пользовательской функции.
Пример сценария:
Пожалуйста, скопируйте и вставьте следующий скрипт в редактор сценариев электронной таблицы и сохраните его.
function SAMPLE(v, key = "sample") {
if (v != "" amp;amp; isNaN(v)) throw new Error("Inputted value is not number.")
const p = PropertiesService.getScriptProperties();
if (v == "") {
p.deleteProperty(key);
}
const previousValue = p.getProperty(key);
if (previousValue) {
const pv = Number(previousValue);
v = pv < v ? v : pv;
}
p.setProperty(key, v);
return v
}
- Чтобы использовать этот скрипт, пожалуйста, поместите пользовательскую функцию
=SAMPLE(A1Notation)
в ячейку. При этом запускается скрипт.
Результат:
Когда приведенный выше скрипт запускается для вашего потока в вашем вопросе, получается следующий результат.
В этом скрипте, когда ячейка пуста, PropertiesService сбрасывается.
Примечание:
- Если вы хотите использовать эту пользовательскую функцию для нескольких ячеек, на текущем этапе может быть сохранено одно максимальное значение. Но, например, если вы хотите использовать каждое максимальное значение для каждой ячейки, пожалуйста, укажите пользовательскую функцию
=SAMPLE(A1Notation, "keyName")
. При этом конкретный ключ используется для propertieservices. Таким образом, каждая пользовательская функция может быть использована для каждого максимального значения.
Ссылки:
Комментарии:
1. Это дает мне ошибку
4. Как я могу это решить?
5. @Cesare Centritto Спасибо, что ответили. Приношу свои извинения за доставленные неудобства.
A1Notation
of=SAMPLE(A1Notation)
— это диапазон значений A1Notation. Так, например, если вы хотите использовать демонстрационный gif-файл, пожалуйста, поместите пользовательскую функцию=SAMPLE(B1)
в ячейку «B2». Таким образом, когда вы помещаете число в ячейку «B1», скрипт работает. Я приношу свои извинения за это.
Ответ №2:
function max() {
let mval = parseInt(PropertiesService.getScriptProperties().getProperty('mval'));
const ss = SpreadsheetApp.openById(gobj.globals.ssid);//this is a global object that I keep things I use a lot. Just replace it with the id of whatever spreadsheet you using
const sh = ss.getSheetByName('Sheet0');//change as required
let val = sh.getRange('B1').getValue();//change as required
if (val > mval) {
PropertiesService.getScriptProperties().setProperty('mval',val);
return val;
} else {
return mval;
}
}
Ответ №3:
- Используйте триггер onEdit для получения последнего значения B1 при каждом редактировании B1.
- Скопируйте это значение в B2, если оно больше текущего значения B2
/**
* @param {GoogleAppsScript.Events.SheetsOnEdit} e
*/
function onEdit(e) {
const [sheetName, maxRangeName] = ['Sheet1', 'B1'];
let sheet;
if (
e.range.getA1Notation() !== maxRangeName ||
(sheet = e.range.getSheet()).getName() !== sheetName
)
return;
const b2Rng = sheet.getRange('B2'),
[b1, b2] = [e.value, b2Rng.getValue()];
if (b1 > b2) b2Rng.setValue(b1);
}