Apps Script новичок здесь, так что любая помощь / направление, которое вы можете предоставить, будет с благодарностью!
У меня есть Apps Script в Google Sheets , который былперебирая строки и перемещая каждую строку по отдельности на новый лист.Я пытаюсь изменить его так, чтобы он захватывал весь массив и одновременно выдвигал его, чтобы сделать его более эффективным теперь, когда он используется все больше.
Вот пример данных, с которыми я пытаюсь работать:
С таким большим количеством кода я могу успешно отфильтровать только те строки, которые имеют значения, выполнить итерацию по ним и убедиться, что все необходимые значения заполнены.
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-массив:
Однако мне нужно взять этот массив, ивставьте некоторые значения между порядковой позицией и добавьте несколько новых в конец нашего процесса загрузки.Итерируя по строкам, это было довольно легко, потому что я в основном говорил «для этой строки, что это за значение?», А затем создавал новый «массив» строк из всех значений, которые я хочу выдвинуть.Тем не менее, как я могу получить все значения в столбце 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 доступен для редактирования любому, у кого есть ссылка, поэтому вы не сможете увидеть, что я пытался сделать.
Спасибо за просмотр!