#google-apps-script #google-sheets
#google-apps-script #google-sheets
Вопрос:
У меня есть два диапазона одинакового размера на разных листах в одной электронной таблице. Я пытаюсь найти строку (на основе пользовательского ввода) на первом листе, а затем использовать этот индекс для изменения таблицы на втором листе, которая подсчитывает, сколько раз этот определенный индекс использовался ранее (чтобы создать красивую круговую диаграмму).
Этот код выполняется, но не выдает результатов на втором листе. Я прошел процесс отладки, и я предполагаю, что по какой-то причине мой цикл for in не выполняется. Прилагается мой код, который принимает вышеупомянутый индекс и пытается выполнить вторую половину моей цели.
function acceptToEncounterChart(ghostrow) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(ss.getSheets()[1]);
ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Average Encounter Chart");
var range = sheet.getRange("B3:B14")
for(var i in range) {
if(ghostrow == i) {
var before = range[i][0].getValue()
range[i][0].setValue(before 1);
}
}
SpreadsheetApp.setActiveSheet(ss.getSheets()[0]);
};
Комментарии:
1. Какова ценность
ghostrow
. Вам не кажется, что это важная информация для отладки вашего кода? Также, если вы не уверены, выполняется ли блок кода, используйтеLogger.log("I am executed")
внутриif
блокаfor
цикла. Это поможет вам определить, в чем проблема, и поможет вам и нам решить ее.2. @Marios ghostrow правильно содержит индекс. Как я уже говорил в сообщении, я почти уверен, что for не запущен, поскольку я уже сделал то, что вы сказали. Мой вопрос в том, почему
Ответ №1:
Объяснение:
Я не совсем уверен, какова ваша цель.
Тем не менее, вот некоторые исправления / улучшения, начиная с самого начала:
-
Вы определяете 2 раза одну и ту же переменную
ss
с точно таким же значением. -
Вам не нужно устанавливать активный лист, если ваша цель — просто получить лист, поэтому эта строка является избыточной:
SpreadsheetApp.setActiveSheet(ss.getSheets()[1]);
-
Переменная
range
— это не массив, а объект диапазона. Вы не можете его проиндексировать и, следовательно, вы также не можете использовать цикл for для итерации по одному объекту. По той же самой причине код внутри оператора if неверен, вы не можете индексироватьrange
. Но вы не видите никаких ошибок, потомуif
что оператор оцениваетfalse
. -
В JavaScript и во многих других языках программирования индексы массива начинаются с
0
. Поскольку ваш диапазон начинается с ячейкиB3
или строки3
, вам необходимо использоватьi 3
для сопоставления данных с диапазоном. -
По той же причине, что и в предыдущем пункте,
ghostrow
это индекс, а не строка.if
Оператор сравнивает индекс массиваi
сghostrow
, поэтомуghostrow
его не следует путать с фактической строкой листа. Например, если вы выберетеghostrow=5
, то текущий сценарий увеличит значение ячейкиB8
(запомнитьi 3
) на 1.
Решение:
Вот рабочий фрагмент кода:
function acceptToEncounterChart(ghostrow) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Average Encounter Chart");
var data = sheet.getRange("B3:B14").getValues().flat();
data.forEach((v,i)=>{
if(ghostrow == i){
sheet.getRange(i 3,2).setValue(v 1)
}
});
ss.setActiveSheet(ss.getSheets()[0]);
}
Похожие:
Пожалуйста, ознакомьтесь с официальной документацией Google Apps script.
Комментарии:
1. ах, мой мозг просто подумал, что, поскольку я установил диапазон для своей таблицы, он просто по умолчанию присвоит строке B3 значение 0. индекс. Я пытался перебрать объект range, потому что я недостаточно внимательно изучил документацию. спасибо, что прояснили это.