#google-apps-script
Вопрос:
Я пытаюсь установить значение ячейки в столбце, когда два других столбца в индексе совпадают со значениями. Как я могу установить значение с помощью индекса? (lt;Отредактировано)
for (let i = 0; i lt; assetId.length; i ) { for (let p = 0; p lt; oldId.length; p ) { if (assetId[i] !="" amp;amp; oldId[p] !="") { if (assetId[i] == oldId[p]) { Logger.log('Old Match: ' assetId[i]) //if match modify 4th column at row [i] to 'null' d.getRange(i,3).setValue('null') } } } }
Основываясь на if AssetID[i] == oldId[p], я пытаюсь изменить столбец F строки [i] на «null»
Редактировать (запрошены примеры)
Столбец J-это старый идентификатор, а K-новый идентификатор
ОЖИДАЕМЫЙ РЕЗУЛЬТАТ: F4 должен быть равен нулю
Полный код:
function replaceIds() { const ss = SpreadsheetApp.getActiveSpreadsheet() const r = ss.getSheetByName("Form Responses 1") const d = ss.getSheetByName("Devices") const oldId = r.getRange("J2:J").getValues().flat() const newId = r.getRange("K2:K").getValues().flat() const studentName = r.getRange("C2:C").getValues().flat() const assetId = d.getRange("G3:G").getValues().flat() const annotatedUser = d.getRange("E3:E").getValues().flat() for (let i = 0; i lt; assetId.length; i ) { for (let p = 0; p lt; oldId.length; p ) { if (assetId[i] !="" amp;amp; oldId[p] !="") { if (assetId[i] == oldId[p]) { Logger.log('Old Match: ' assetId[i]) //if match modify 4th column at row [i] to 'null' d.getRange(i,3).setValue('null') } } } //new asset ID loop for (let r = 0; r lt; newId.length; r ) { //Logger.log(oldId[p]) if (assetId[i] !="") { if (newId[r] !="") { //Logger.log('## not null ##') if (assetId[i] == newId[r]) { Logger.log('New Match: ' assetId[i]) } } } } } }
Комментарии:
1. Можете ли вы предоставить образец данных, которые мы можем проверить, и ожидаемый результат, чтобы его можно было более четко визуализировать
2. Добавлены примеры данных
Ответ №1:
Вопрос:
- Проблема в том, что использование вложенного
for
цикла не является хорошей идеей, так как вы не можете правильно отслеживать, где находится правильный индекс, а также без необходимости повторять элементы, которые уже были посещены.
Решение:
- Зацикливания только на
assetId
этом должно быть достаточно, а затем использованиеindexOf
as поможет вам определить, принадлежит ли определенный элемент (текущийassetId
) массиву (спискуoldId
элементов). - Если
assetId
будет найдено,indexOf
вернет неотрицательное число (именно по какому индексу элемент найден в массиве). - Исключите пустые
assetId
s из-за того, как вы получаете свои данные - Затем вы можете удалить столбец той же строки, но так
index
как он начинается с 0, а ваши данные начинаются с 3-й строки, нам нужно сдвинутьgetRange
строку так, чтобы она соответствовала ячейке, которую мы хотим удалить правильно.
Изменение вашего текущего решения-это то, о чем говорится в решении выше, и оно должно работать.
Скрипт:
function replaceIds() { const ss = SpreadsheetApp.getActiveSpreadsheet() const r = ss.getSheetByName("Form Responses 1") const d = ss.getSheetByName("Devices") const oldId = r.getRange("J2:J").getValues().flat() const newId = r.getRange("K2:K").getValues().flat() const studentName = r.getRange("C2:C").getValues().flat() const assetId = d.getRange("G3:G").getValues().flat() const annotatedUser = d.getRange("E3:E").getValues().flat() // loop your assetId assetId.forEach(function(cell, index){ // if assetId is listed under oldId, remove annotated location of that row // also, skip any rows where assetIds are blank if(oldId.indexOf(cell) gt; -1 amp;amp; cell != "") // offset here is 3 since assetId starts at G3 and index starts at 0 // 3 - 0 = 3, which is the offset, and 6 is column F d.getRange(index 3, 6).setValue(''); }); }
Выход:
Комментарии:
1. Спасибо! Я попробую это
Ответ №2:
Эта функция изменит значение в столбце 1, если значение col2 в этом индексе находится в столбце 10 в любой строке. вы можете изменять индексы по своему усмотрению.
function findDataBasedOnMatch() { const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName('Sheet0'); const sr = 2;//data start row const vs = sh.getRange(sr, 1, sh.getLastRow() - sr 1, sh.getLastColumn()).getValues(); const col10 =vs.map(r =gt; r[9]);//you pick the indices vs.forEach((r,i) =gt; { if(~col10.indexOf(r[1])) {//you pick the indices sh.getRange(i sr, 1).setValue(''); } }); }
Комментарии:
1. Извините, я неудачно выразился. Я сравниваю ячейки внутри столбца, а не сам столбец
2.
cells within the column
Я не думаю, что понимаю3. Я сделал вложенный цикл for, чтобы сравнить каждое значение в столбце oldId с каждым значением в столбце AssetID. Если указанные значения равны, я хочу изменить значение в другом столбце в той же строке, где было найдено совпадение. Моя проблема заключается в присвоении этого значения с помощью setValue
4. Я думаю, что, возможно, эта последняя модификация ближе к тому, что вы ищете