Попытка установить значение для сценария Loop — apps

#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. Я думаю, что, возможно, эта последняя модификация ближе к тому, что вы ищете