我正在嘗試設置一個工作時間表的問題。當某些數據輸入到列「J」中時,我希望將整行移動到相應的新選項卡。我爲我創建的示例表添加了一個可編輯鏈接,這也有助於解釋我正在嘗試做什麼。Google表單將行移至新工作表的腳本
如果可能,也可以使背景更改爲樣本表上的顏色。
謝謝!
編輯鏈接:https://docs.google.com/spreadsheets/d/1D0iptPchrrLuq75ysvXwisBa_Xr0fuNabAdTb3sm-yA/edit?usp=sharing
我正在嘗試設置一個工作時間表的問題。當某些數據輸入到列「J」中時,我希望將整行移動到相應的新選項卡。我爲我創建的示例表添加了一個可編輯鏈接,這也有助於解釋我正在嘗試做什麼。Google表單將行移至新工作表的腳本
如果可能,也可以使背景更改爲樣本表上的顏色。
謝謝!
編輯鏈接:https://docs.google.com/spreadsheets/d/1D0iptPchrrLuq75ysvXwisBa_Xr0fuNabAdTb3sm-yA/edit?usp=sharing
這是一個原始代碼,將工作,但是如果你的值更改爲相同的,這是對(所以如果它在完整,並對其進行編輯更改爲20)它只會刪除該行。這將是很容易解決,但我現在沒有時間:)
編輯:只記得要注意,它會使用最後一行,因此移動的東西回約會,你應該移動圖例頂部的圖例:)或者你應該完全擺脫約會的位置。你也可以玩弄變量的工作方式,我只是不喜歡再次抓取表單,所以我發送了很多它們到移動函數。
function onEdit(e) {
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); //get active spreadsheet
var srcSheet = spreadSheet.getActiveSheet(); //get active sheet
var editCol = e.range.getColumn(); //check the edited column
if (editCol!==10) {return} //if the edited column is not J then we don't need to do anything else
var srcLastCol = srcSheet.getLastColumn(); //check how large is our data range
var srcRow = srcSheet.getRange(e.range.getRow(), 1, 1, srcLastCol); //get the source row range
var srcVals = srcRow.getValues(); //get the values from the source fow
var destSheet, destRow, destRange; //destination variables
Logger.log(e.value)
if (e.value>=1 && e.value<=14) { //for 1-14 we use we assign 1 sheet, the same function for everything
moveRow('In Shop', srcRow, srcVals, srcLastCol, spreadSheet);
}
else { //for everything else we use a switch
switch(e.value) {
case '15':
moveRow('Arrive/In Lot', srcRow, srcVals, srcLastCol, spreadSheet);
break;
case '17':
moveRow('Waiting on Parts, Truck, Etc.', srcRow, srcVals, srcLastCol, spreadSheet);
break;
case '20':
moveRow('Completed', srcRow, srcVals, srcLastCol, spreadSheet);
break;
default :
moveRow('Appointments', srcRow, srcVals, srcLastCol, spreadSheet);
}
}
}
function moveRow(destName, srcRow, srcVals, srcLastCol, spreadSheet) {
var destRow
var destSheet = spreadSheet.getSheetByName(destName)
destRow = destSheet.getLastRow() + 1;
destSheet.getRange(destRow, 1, 1, srcLastCol).setValues(srcVals)
srcRow.clear()
}
EDIT2 接聽評論
function moveRow(destName, srcRow, srcVals, srcLastCol) {
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet()
var destRow
var destSheet = spreadSheet.getSheetByName(destName)
destRow = destSheet.getLastRow() + 1;
destSheet.getRange(destRow, 1, 1, srcLastCol).setValues(srcVals)
srcRow.clear()
}
然而,這將是具有長運行任何較大的腳本不好的做法。那麼您每次都會浪費時間訪問SpreadsheetApp。
至於顏色,它在moveRow(一個相當簡單的調整):
function moveRow(destName, srcRow, srcVals, srcLastCol, spreadSheet) {
var destRow
var destSheet = spreadSheet.getSheetByName(destName);
destRow = destSheet.getLastRow() + 1;
var destRange = destSheet.getRange(destRow, 1, 1, srcLastCol);
destRange.setValues(srcVals);
destRange.setBackground(destSheet.getTabColor())
srcRow.clear()
}
爲排列,這就是你需要調用moveRow之前有destSheet = spreadSheet.getSheetByName(destName);
()。因此,我們假設您在if
或if
之前的某個位置檢索了destSheet。此示例將在升序列排序它(所以調整1到你所需要的,讓我們說你要j時,這將是10)
if (e.value>=1 && e.value<=14) {
moveRow('In Shop', srcRow, srcVals, srcLastCol, spreadSheet);
destSheet.sort(1)acceding order
}
Vytautas,這很好!謝謝!還有一個問題,我將如何去改變背景變化到相應的顏色,取決於它在哪個標籤上?還有,「店內」的商品是否會自動按數字排序? 此外,你是什麼意思再次抓表和我試着改變哪些變量?抱歉有這些問題。我仍然很難理解腳本是如何工作的( – Joe
)沒有足夠的字符和格式將很難解釋這裏的一切,我會敦促你開始使用[參考](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app),因爲它很容易遵循(只需點擊返回類型並按照你需要的每個函數)。至於抓取表,每個'spreadSheet = SpreadsheetApp。getActiveSpreadsheet()'會花費時間,所以我不再讓函數再次執行這個動作,而只是將主函數的對象引用發送到moveRow(),所以我不必再次執行它並浪費執行時間 – Vytautas
請參閱顏色問題的編輯答案並分類 – Vytautas
你想讓他們複製或完全轉移到另一張?你已經試過了什麼? –
這並不難。製作你的工作表的副本,並製作一個腳本,可以做到這一點 – Vytautas