我有一張我撰寫了腳本的作業表,但我被困在一個地方。我得到的報告將所有倉庫放在一起,手動拆分它們很耗時。這是腳本的最后一部分,我很難過。
B 列是列出所有倉庫的位置。我希望將所有倉庫 1 移動到倉庫 1、倉庫 2 到倉庫 2 的頁面……等等。這是我到目前為止的代碼,它沒有像我預期的那樣運行。呼叫倉庫 1 的訂單讓我從倉庫 2 和 5 獲得訂單。不是所有的,只是少數。任何幫助,將不勝感激。
function splitYards(sheet){
//getting the proper range from All Warehouses This works don't change it
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("All Warehouses");
var awLastRow = sheet.getLastRow();
var awRange = sheet.getRange(2,2,awLastRow-1,1);
var awValues = awRange.getValues();
//end of this working
//console.log(awValues);
//begin For statement
for (var i=1; i<awValues.length; i ) {
if (awValues[i] == 1){
var destination = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Warehouse 1");
var drange = sheet.getRange(1,i,1,1);
var dValue = drange.getValues();
//console.log(dValue);
//does not work yet...
// dValue.copyTo(destination);
}
}
}
我添加了一個簡單的示例來嘗試解釋。來自倉庫 1 的任何東西都被復制到另一個名為 Warehouse 1 的作業表中。來自 Warehouse 2 的所有專案都被移動到一個名為 Warehouse 2 的作業表中。我想將整行移動到新作業表中。

uj5u.com熱心網友回復:
我相信你的目標如下。
- 如您的問題所示,您在 Google 電子表格中有一張作業表。
- 您要檢查“B”列并希望將行移動到目標作業表。
- 例如,當“B”列的值為 時
1,您希望將該行Warehouse 1作為附加值移動到作業表中。
修改點:
getValues()回傳二維陣列。在這種情況下,awValues[i] == 1是awValues[i][0] == 1。在您的腳本中,只使用了一張紙。
為了使用您的 for 回圈從一行中檢索值,請修改
var drange = sheet.getRange(1,i,1,1)為sheet.getRange(i 2, 1, 1, sheet.getLastColumn()).例如,當您想使用 for 回圈時,您可以進行如下修改。
for (var i = awValues.length - 1; i >= 0; i--) { if (awValues[i][0] == 1) { var destination = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Warehouse 1"); var drange = sheet.getRange(i 2, 1, 1, sheet.getLastColumn()); drange.moveTo(destination.getRange(destination.getLastRow() 1, 1)); } }但是,當
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Warehouse 1"),moveTo并getValues()在回圈使用,程序成本會很高。
所以,在這個答案中,我想提出以下修改后的腳本。
修改后的腳本:
function splitYards2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("All Warehouses");
var range = sheet.getRange("A2:D" sheet.getLastRow());
var values = range.getValues();
var sheets = [...new Set(values.map(r => r[1]))].reduce((o, e) => (o[e] = ss.getSheetByName("Warehouse " e) || ss.insertSheet("Warehouse " e), o), {});
[...values.reduce((m, r) => m.set(r[1], m.has(r[1]) ? [m.get(r[1]), r] : r), new Map())]
.forEach(([k, v]) => {
var s = sheets[k];
if (s) s.getRange(s.getLastRow() 1, 1, v.length, v[0].length).setValues(v);
});
range.clearContent();
}
- 運行此腳本時,通過選中“B”列將行從作業
All Warehouses表移動到作業Warehouse #表。
關于一些不清楚的地方,我猜測如下。
- 我無法理解,當找不到從“B”列檢索到的作業表名稱的作業表時,你想要做什么。因此,在此修改中,當
Warehouse #從“B”列檢索到的作業表名稱不存在時,插入新作業表作為作業表名稱。
參考:
- 減少()
- 獲取范圍(行,列,numRows,numColumns)
- 清除內容()
uj5u.com熱心網友回復:
您的代碼似乎正在抓取不正確的范圍以復制到目標作業表。
的起始索引awValues為 0。您的代碼呼叫sheet.getRange(1,i,1,1),但這沒有考慮到陣列中的索引與作業表上的行號不對齊。陣列的索引 0 實際上對應于作業表的第 2 行,索引 1 -> 第 3 行,依此類推。
您應該調整范圍選擇的起始行,如下所示:
var drange = sheet.getRange(1,i 2,1,1);
兩個附加說明:
- 您的迭代
awValues從索引 1 開始,而不是 0。這意味著您無意中跳過了第一行。 awValues是一個二維陣列,因為您呼叫了getValues. 為避免混淆,最好這樣對待它并將您的 if 條件更改為awValues[i][0] == 1(即 row 的第一列i)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/408568.html
標籤:
