Каков наиболее оптимальный способ создания нового массива из массива и передачи значений на другой лист в скрипте приложений? - PullRequest
0 голосов
/ 19 сентября 2018

Apps Script новичок здесь, так что любая помощь / направление, которое вы можете предоставить, будет с благодарностью!

У меня есть Apps Script в Google Sheets , который былперебирая строки и перемещая каждую строку по отдельности на новый лист.Я пытаюсь изменить его так, чтобы он захватывал весь массив и одновременно выдвигал его, чтобы сделать его более эффективным теперь, когда он используется все больше.

Вот пример данных, с которыми я пытаюсь работать: enter image description here

С таким большим количеством кода я могу успешно отфильтровать только те строки, которые имеют значения, выполнить итерацию по ним и убедиться, что все необходимые значения заполнены.

function userSubmitTest() {
var ss = SpreadsheetApp.openById('1ozOeBPLzouZTEm0SECW0JZwfxHMcr3dr-augiTra6tY');
var dataSheet = ss.getSheetByName('Data Entry');
var downloadSheet = ss.getSheetByName('ExportForDownload');
var historicalSheet = ss.getSheetByName('ExportHistorical');
var spreadsheetTimeZone = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
var submittedDate = Utilities.formatDate(new Date(), spreadsheetTimeZone, "MM/dd/yyyy' 'HH:mm:ss");

// Data Sheet Details
var downloadNumColumns = downloadSheet.getLastColumn();
var downloadIndex = downloadSheet.getLastRow();

//Historical Sheet Details
var historicalNumColumns = historicalSheet.getLastColumn();
var historicalIndex = historicalSheet.getLastRow();

// Initial Sheet Values
var newLastColumn = dataSheet.getLastColumn();
var newLastRow = dataSheet.getLastRow();
var dataToProcess = dataSheet.getRange(2, 1, newLastRow - 1, newLastColumn).getValues().filter(function(row) {
    return row[0]
})

// Get Spreadsheet UI
var ui = SpreadsheetApp.getUi();
var dLen = dataToProcess.length;
var row = 2;

// Loop through processing lines to make sure A:D are filled out for each row
for (var i = 0; i < dLen; ++i) {
    var bolCheck = dataToProcess[i][0];
    var sapCheck = dataToProcess[i][1];
    var notesCheck = dataToProcess[i][2];
    var reasonCheck = dataToProcess[i][3];

    if (bolCheck == "") { // Check all processing lines to make sure delivery docs are entered
        var noBOL = ui.alert(
            'Warning!',
            'Please ensure all lines have a Delivery Document number in A2:A, or clear them, before submitting.',
            ui.ButtonSet.OK);
        return
    } else if (sapCheck == "") { // Check all processing lines to make sure order numbers are entered
        var noSAP = ui.alert(
            'Warning!',
            'Please ensure all lines have a SAP/ECC Order Number number in B2:B, or clear them, before submitting.',
            ui.ButtonSet.OK);
        return
    } else if (notesCheck == "") { // Check all processing lines to make sure notes are entered
        var noNotes = ui.alert(
            'Warning!',
            'Please ensure all lines have notes listed in C2:C, or clear them before submitting.',
            ui.ButtonSet.OK);
        return
    } else if (reasonCheck == "") { // Check all processing lines to make sure reasons are entered
        var noNotes = ui.alert(
            'Warning!',
            'Please ensure all lines have a reason selected in D2:D, or clear them before submitting.',
            ui.ButtonSet.OK);
        return
    }

}

Я могу сказать, что многое работает, потому что в отладке я вижу следующий 2D-массив: enter image description here

Однако мне нужно взять этот массив, ивставьте некоторые значения между порядковой позицией и добавьте несколько новых в конец нашего процесса загрузки.Итерируя по строкам, это было довольно легко, потому что я в основном говорил «для этой строки, что это за значение?», А затем создавал новый «массив» строк из всех значений, которые я хочу выдвинуть.Тем не менее, как я могу получить все значения в столбце A: A в одну строку и начать создавать новый массив на основе этих порядковых позиций и некоторого другого текста / дат, которые я пытаюсь вставить?Как только массив будет создан, установите значения все одновременно, а не итерируйте построчно.

Это то, что я сейчас использую при итерации по строкам:

for (var j = 0; j < dLen; ++j) {
    var bolCheck = dataToProcess[j][0];
    var sapCheck = dataToProcess[j][1];
    var notesCheck = dataToProcess[j][2];
    var reasonCheck = dataToProcess[j][3];
    var rdd = dataToProcess[j][4];
    if (rdd) {
        rdd = Utilities.formatDate(rdd, spreadsheetTimeZone, "MM/dd/yyyy");
    }
    var submittedBy = dataToProcess[j][5].toString();
    var submittedOn = dataToProcess[j][6];
    if (submittedOn) {
        submittedOn = Utilities.formatDate(submittedOn, spreadsheetTimeZone, "MM/dd/yyyy' 'HH:mm:ss");
    }
    var array = [];
    array.push(bolCheck, "Company Submitted", sapCheck, reasonCheck, rdd, "Company Order Desk", "1-800-999-9999", "", notesCheck, submittedBy, submittedBy, submittedOn, submittedDate, "Company Submitted " + submittedDate, "Company Submitted " + submittedDate, submittedDate);

        downloadSheet.insertRowsAfter(downloadIndex, 1).getRange(downloadIndex + 1, 1, 1, historicalNumColumns).setValues([array]);
        historicalSheet.insertRowsAfter(historicalIndex, 1).getRange(historicalIndex + 1, 1, 1, historicalNumColumns).setValues([array]);

Если что-то из этого неясно, обязательно дайте мне знать, чтобы я мог добавить больше контекста.Google Sheet доступен для редактирования любому, у кого есть ссылка, поэтому вы не сможете увидеть, что я пытался сделать.

Спасибо за просмотр!

1 Ответ

0 голосов
/ 20 сентября 2018

Я думаю, вы почти все поняли.Последнее, что нужно сделать, это добавить массив из одной строки в другой массив «все строки» в вашей последней функции.Как это:

var allRows = []; //define outside your loop
for (var j = 0; j < dLen; ++j) {
    var bolCheck = dataToProcess[j][0];

    //... same code you already have ...

    array.push(bolCheck, "Company Submitted", sapCheck, reasonCheck, rdd, "Company Order Desk", "1-800-999-9999", "", notesCheck, submittedBy, submittedBy, submittedOn, submittedDate, "Company Submitted " + submittedDate, "Company Submitted " + submittedDate, submittedDate);

    allRows.push(array);
} //close your for loop

downloadSheet
    .insertRowsAfter(downloadIndex, allRows.length)
    .getRange(downloadIndex + 1, 1, allRows.length, historicalNumColumns)
    .setValues(allRows);
historicalSheet
    .insertRowsAfter(historicalIndex, allRows.length)
    .getRange(historicalIndex + 1, 1, allRows.legnth, historicalNumColumns)
    .setValues(allRows);

ps: я не проверял это, так как этот фрагмент не был завершен

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