Данные карты с одного листа на другой - PullRequest
1 голос
/ 20 января 2020

У меня есть ситуация, похожая на ситуацию в этом вопросе , где я пытаюсь сопоставить демографические данные пользователя c с листом ответов при отправке формы. Решение работало правильно во всех ситуациях. Всякий раз, когда один из идентификаторов пользователя не соответствует идентификатору, доступному в реестре, он просто пропускает эту строку и продолжает переходить к следующей строке.

У меня возникают проблемы, когда я пытаюсь изменить код, включив в него еще один столбец (я хочу отсканировать и сопоставить столбец I из «реестра» в «лист ответов»). Это оригинальное решение:

function extractId() {
  var responsesSheet = SpreadsheetApp.openById('XXXXXXX').getSheetByName('Sheet1');
  var rosterSheet = SpreadsheetApp.openById('XXXXXXX').getSheetByName('Sheet1');
  var valuesOfresponsesSheet = responsesSheet.getRange(2, 2, responsesSheet.getLastRow() - 1, 1).getValues();
  var valuesOfrosterSheet = rosterSheet.getRange(2, 1, rosterSheet.getLastRow() - 1, 8).getValues();
  var obj = valuesOfrosterSheet.reduce(function(o, e) {
    o[e[0]] = [e[0], e[1], e[5], e[6], e[7]];
    return o;
  }, {});

  // var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].replace(/\@(.*)/i,"")]});
  var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].toString().replace(/\@(.*)/i,"")] || ["","","","",""]}); // Modified

  responsesSheet.getRange(2, 3, resultValues.length, resultValues[0].length).setValues(resultValues);
}

И вот как я его изменил:

function extractId() {
  var responsesSheet = SpreadsheetApp.openById('1bDtDMkWDosKsf0EDV08VY-pzE8Okr5kqQU0vnNps6mo').getSheetByName('Form Responses 1');
  var rosterSheet = SpreadsheetApp.openById('196JpI3cvJZOynhqL0kyBoxqXap9NtykBG5RvCPtl7dA').getSheetByName('Sheet1');
  var valuesOfresponsesSheet = responsesSheet.getRange(2, 2, responsesSheet.getLastRow() - 1, 1).getValues();
  var valuesOfrosterSheet = rosterSheet.getRange(2, 1, rosterSheet.getLastRow() - 1, 9).getValues();
  var obj = valuesOfrosterSheet.reduce(function(o, e) {
    o[e[0]] = [e[0], e[1], e[5], e[6], e[7], e[8]];
    return o;
  }, {});

  // var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].replace(/\@(.*)/i,"")]});
  var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].toString().replace(/\@(.*)/i,"")] || ["","","","",""]}); // Modified

  responsesSheet.getRange(2, 3, resultValues.length, resultValues[0].length).setValues(resultValues);
}

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда не совпадает идентификатор ( то есть, если столбец B «листа ответов» не соответствует одному из элементов столбца A в «реестре»), я получаю следующую ошибку: The number of columns in the data does not match the number of columns in the range. The data has 5 but the range has 6. (line 14, file "Code"). Код перестает работать с любой строкой, в которой несовпадающий идентификатор будет.

Я хотел бы, чтобы при отсутствии совпадения идентификатора код просто продолжал переходить к следующей строке.

1 Ответ

1 голос
/ 21 января 2020

Как насчет этой модификации?

В вашей модификации я могу подтвердить, что один элемент был добавлен как o[e[0]] = [e[0], e[1], e[5], e[6], e[7], e[8]]. В этом случае e[8] было добавлено. Так что в этом случае требуется также добавить один элемент к ["","","","",""], как ["","","","","",""]. Я думаю, что это является причиной вашей проблемы.

Поэтому, пожалуйста, измените нижний сценарий в вашем вопросе следующим образом.

От:

var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].toString().replace(/\@(.*)/i,"")] || ["","","","",""]});

Кому:

var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].toString().replace(/\@(.*)/i,"")] || ["","","","","",""]});

Если это не было прямым решением, я прошу прощения. В то же время вы можете предоставить образец электронной таблицы для воспроизведения вашей проблемы. Этим я хотел бы подтвердить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...