Google apps scriptで仕事中に使えるスプレッドシートのシステムを作っています。
スクリプトで効率化する味を占めてしまい、新しい内容に手をつけましたが、コードを書き始めたのが先月中旬からでまだまだ理解の乏しい私には難しく、検索しては継ぎ接ぎをして作り直していますが、エラーが連発してしまい完全に作業が止まってしまいました。
思いつく内容も出切ってしまい、素人目では、もはや何が間違っているのかも正直わかりません。
恐れ入りますが、どうか原因や改善点をご教示いただけないでしょうか?
よろしくお願いいたします。
実現したいこと
シートAとシートPがあり、別のシステムからエクスポートした情報をシートPに貼り付け。
シートPに貼り付けた情報は多いときには500件程のデータを確認することになります。シートAに重複するものがあれば上書き、無ければデータ最下行に追加できるものを目指しています。
・シートPに貼り付けるデータはA-CB列まであり、1行目がヘッダー、それ以降は横軸表記で筐体番号や本体名が並んでいます。
データ量としては日によって増減するため、情報量は一定ではありません。(多いときには500件ほどの量になります。)
・シートAに貼り付けをするときには必要情報のみ抽出して貼り付けたいので、列の順番変更を取り入れています。
・シートA / Pの重複確認のキーワードにはそれぞれに含まれる筐体番号(シートA / P共に3列目)と本体名(シートA / P共に4列目)での確認としています。
・シートAには以上で並び替えた必要情報を随時更新、累積していくため、膨大な量になっていく予定なので、今後フィルターでシートAの情報量も調整していく予定です
発生している問題・エラーメッセージ
自信の素人考えではシートAとシートPの両方で変数を作りシートPの内容をシートAで走査、該当があれば更新、無ければ追加。ループに戻りシートPを全部確認し終えた時点で終了。
と、したいのですが、for から ifまではできているのだと思うのですが、setValueの部分でThe parameters (number[]) don't match the method signature for SpreadsheetApp.Range.setValues.となってしまいます。
エラーメッセージ The parameters (number[]) don't match the method signature for SpreadsheetApp.Range.setValues. ### 該当のソースコード ```ここに言語名を入力 function copyPaste() { const col_A = "A"; const col_C = "C"; const col_M = "M"; const today = new Date(); today.setHours(0, 0, 0, 0); const today_GetTime = today.getTime(); var ss = SpreadsheetApp.getActiveSpreadsheet(); const p_sh = ss.setActiveSheet(ss.getSheetByName('PASTE'), true).activate(); const a_sh = ss.setActiveSheet(ss.getSheetByName('A CHECK'), true).activate(); // 'A CHECK' const a_Values = a_sh.getRange(col_C + "4:" + col_M + a_sh.getLastRow()).getValues(); // 'PASTE' const p_values = p_sh.getRange(col_A + "1:" + p_sh.getLastRow()).getValues(); // 'PASTE' 貼り付け日でフィルター const p_filtered = p_values.filter(function (element) { return typeof element[0] == 'object' && element[0].getTime() == today_GetTime; }); // Col並び替え const p_MoveCol = p_filtered.map(elm => [elm[0], elm[7], elm[19], elm[3], elm[4], elm[29], elm[15], elm[17], elm[16], elm[26], elm[35]]); for (var p = 0; p < p_MoveCol.length; p++) { // 'PASTE' for (var a = 0; a < a_Values.length; a++) { // 'ARR CHECK' if (p_MoveCol[p][3] === a_Values[a][3] && p_MoveCol[p][4] === a_Values[a][4]) { a_sh.getRange([ a + 1 ] , 3, 1, 12).setValues(p_MoveCol[[p]]); } else { // 行が見つからなかったら新しくデータを挿入 sheet_CopyTo.appendRow([[p]]); return a + 1; } } } };
試したこと
setValues内を変数に変更してみたり、書き順を変えてみたり、[ ]を増やしてみたりと素人ながらに試しましたが全滅でした。
回答1件
あなたの回答
tips
プレビュー