2017-06-27 9 views
0

私はgoogleスクリプトを初めて使用しています。私はウェブから見つかった "write once"スクリプトを修正するために最善を尽くしています。現在、私は温度、湿度などの実験室機器の記録を記録しているスプレッドシートに取り組んでいます。このスプレッドシートでは、最初の行は月の日であるため、B1は1日目、AF1は31日目です。最初の列には、記録が必要なもののリストが含まれています。湿度のような温度;だからA2:A12。すべての読みがB2:AF12に記録されます。行14は、読み取り値の記録を行った技術者が、その頭文字を付ける場所です。例えば、その月の1日目に、技術者はB14に頭文字をつけます。カラム内のすべてのデータが記録された後にポップアップ確認メッセージを追加する

以下は、いくつかの変更を加えたスクリプトです。このスクリプトの問題は、読み取り値が入力されるたびに値を確認するポップアップメッセージが表示されることです。その代わりに、その日の読書を収集した技術者が自分の頭文字を落とした後、メッセージが最後に表示されたかったのです。私はポップアップに「すべての読書を確認してください!これらの読書は一度確認することはできません」のようなものを言いたかった。 「はい」を選択すると、その日のすべての読み取り値と初期値が、ヘルパーシートとアクティブシートに保存されます。いいえを選択した場合、ヘルパーシートには何も保存されません。技術者が戻ってエラーを修正する(読みの1つでタイプミス)。すべてが正しいことを確認した後、技術者は再度最初に表示され、確認用のポップアップで[はい]を選択します。

function onEdit() { 
var firstDataRow = 2; // only take into account edits on or below this row 
var lastDataRow = 14; // only take into account edits on or above this row 
var firstDataColumn = 2; // only take into account edits on or to the right of this column 
var lastDataColumn = 32; // only take into account edits on or to the left of this column 
// naming pattern for sheets where values are copied for later checking 
var helperSheetNameSuffix = "_helper"; 
// sheets that are free to edit with no protection 
var freeToEditSheetNames = ["Free to edit 1", "Free to edit 2", helperSheetNameSuffix + "$"]; 
// You can use regular expressions in sheet names. The match is not case-sensitive, 
// so "free.*edit" will match "free to edit", "Free Editing for Everyone", 
// "Sheet (free to edit)" and "Free edit playground". 
// Leave the last entry, helperSheetNameSuffix + "$", as it is to ensure that changes to a 
// helper sheet do not trigger the creation of another _helper_helper sheet. 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var masterSheet = ss.getActiveSheet(); 
var masterSheetName = masterSheet.getName(); 
var masterCell = masterSheet.getActiveCell(); 
var sheetNameRegExp; 
// do not record edits on free to edit sheets 
for (var sheet in freeToEditSheetNames) { 
sheetNameRegExp = new RegExp(freeToEditSheetNames[sheet], "i"); 
if (sheetNameRegExp.test(masterSheetName)) return; 
} 
// find helper sheet 
var helperSheetName = masterSheetName + helperSheetNameSuffix; 
var helperSheet = ss.getSheetByName(helperSheetName); 
if (helperSheet == null) { // helper sheet does not exist yet, create it as the last sheet in the spreadsheet 
helperSheet = ss.insertSheet(helperSheetName, ss.getNumSheets()); 
Utilities.sleep(2000); // give time for the new sheet to render before going back 
ss.setActiveSheet(masterSheet); 
helperSheet.hideSheet(); 
ss.setActiveRange(masterCell); 
} 
if (masterCell.getRow() < firstDataRow || masterCell.getColumn() < firstDataColumn || masterCell.getRow() > lastDataRow || masterCell.getColumn() > lastDataColumn) return; 
var helperCell = helperSheet.getRange(masterCell.getA1Notation()); 
var newValue = masterCell.getValue(); 
var oldValue = helperCell.getValue(); 

var ui = SpreadsheetApp.getUi(); 
var response = ui.alert('Is This Entry Correct?', 'This cell cannot be changed after entering a value', ui.ButtonSet.YES_NO); 
if (response == ui.Button.YES && oldValue == "") { 
masterCell.setValue(newValue); 
helperCell.setValue(newValue); 
} 
if (response == ui.Button.YES && oldValue !== "") { 
masterCell.setValue(oldValue); Browser.msgBox('You can not change this value. Please make corrections under Comment & Date/Initial'); 
} 
if (response ==ui.Button.NO && oldValue == "") { 
Browser.msgBox('Please Enter A New Value!'); masterCell.setValue(""); return 
} 
if (response ==ui.Button.NO && oldValue !== "") { 
masterCell.setValue(oldValue); 
} 
} 

はあなた

+0

あなたが提供することができます私たちのシートのサンプル? –

+0

https://docs.google.com/spreadsheets/d/1agb9d9MxC7veXlz2ReWQapKmfhLcDMa_gOuebarYbgQ/edit?usp=sharing – ERMaster

+0

[ツアー]とチェックアウト[質問]に従ってください。 –

答えて

0

OnEdit()機能を使用して関数を開始すると、スプレッドシートは値を入力または変更するたびにスクリプトを継続的に実行します。

そのため、ユーザーは新しい関数内のすべての値を挿入したときにポップアップMSGボックスを使用することだろうきれいな方法:

function submitvalues(){ 
    var sheet = spreadSheetApp.getActive().getActiveSpreadsheet(); 
    var question = Browser.msgBox('Is This Entry Correct?', 'This cell cannot be changed after entering a value', Browser.Buttons.YES_NO); 

if(question == 'no'){ 


//etc. etc.} 
} 

はしかし、それはあなたが割り当てたボタンを作成するか簡単になりましたまたはへのスクリプトのこのビットは、ヘルプボタンの隣にこれを行うことによって、新しいメニュー項目を作成します

function onOpen() { 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Update') 
     .addItem('Update All Data', 'submitvalues') 

     .addToUi(); 
} 

もう一つのヒントを、あなたのスクリプトがmastersheetで提出された値をループになり簡素化し、として、それらを書くためにヘルパーシートの配列。いずれかのセルが空で、エラーボックスを返す場合は、その配列内をチェックできます。現在持っている変数をすべて作成する必要はありません。

EDIT: あなたはあなたの最初のsubmitboxメッセージを行っている最後に透過性submitvalues機能でこれを挿入し、スクリプトに合わせて適応する必要があることだけ例:

var val = mastersheet.getRange(2,sheet.getLastColumn(),12,1).getValues(); // this will take the data in the last column where you have just added the new data for 12 rows 

for (var i=0;i<val.length;i++){ //this is where you start the loop 
if (val[i]==""){ 
Browser.msgBox('Not all values are inserted, please return and insert all values') 
return}// this is where you stop the function when the if statement is false 
} 
helpersheet.getRange(start row, start column, val.length,val[0].length).setValues(val); //this is where you set your values from the mastersheet 
} 
+0

ありがとうございました。 Googleスクリプトや一般的なプログラミングは、私が先週取り上げたものなので、たくさんの概念はまだ私には非常に新しいものです。mastersheetのサブミットされた値を使ってループを実行し、ヘルパーシートに配列として書き込む方法や、ループを実行する方法の例を表示することは可能です。おかげで – ERMaster

+0

ループで私の最初の答えを編集したばかりです。これが役立つことを願って、upvoteを忘れないでください。これがあなたが探している答えであれば、答えられたボタンを押してください –

0

スクリプトを編集し、単純なトリガーにするために使用されている予約語を使用してのonEditありがとうございました。

編集が実行されるたびに何かが発生するようにする場合は、if..else、switchなどのようなJavaScript statementを追加する必要があります。

関連する問題